SurfaceView
現在、メイン UI にないスレッドからカスタムへの描画に問題があります。これSurfaceView
は画面全体 (フルスクリーンの Galaxy S3) を占め、複数のソースから更新する必要があります。
問題は、カスタムSurfaceView
が UI の更新の間に変更を保存しないことです。
カスタムクラスは、それを使用するアクティビティ内で定義され、更新の定期的なチェックを実行SurfaceView
するスレッド (と呼びましょう) は、カスタムクラス内で定義されます。このチュートリアルと同様にこれを行いました。DrawingThread
SurfaceView
別の外部スレッドが、UI に加える必要がある変更のリストを更新しています。DrawingThread
このリストを 50 ミリ秒ごとにチェックし、リストが空でない場合は、再描画する必要がある長方形を計算します。
// Thread waits for change request to UI or kill order
// Build Rect at point of Touch
try {
Canvas = _surfaceHolder.lockCanvas(Rect);
synchronized (_surfaceHolder) {
postInvalidate(); //Calls custom SurfaceView's onDraw() with the correct Canvas
}
} finally {
if (Canvas != null) {
_surfaceHolder.unlockCanvasAndPost(Canvas);
}
}
// Loop
私onDraw()
のカスタム方法SurfaceView
は次のとおりです。
@Override
public void onDraw(Canvas canvas) {
// Initialize vars for rectangle
Paint.setStyle(Style.FILL);
for (MapChanges change : ExternalClass.getMapChanges()) {
// Build Rect at point of Touch
// Select Color for Paint
canvas.drawRect(Rect, Paint);
ExternalClass.removeMapChange(change); //Thread safe
}
}
onDraw()
これは、以前の呼び出しからの変更を忘れているという事実を除いて、問題なく機能します。現在、を使用してこれをテストしていOnTouchListener
ます。
私が理解しているコード手順:
- タッチすると、UI の変更要求が のリストに追加されます
ExternalClass
。 DrawingThread
リストが空でなくなったことを確認し、Canvas を安全に取得して、 customのpostInvalidates()
を呼び出します。SurfaceView
onDraw()
onDraw()
は UI を更新し、から変更要求を削除しExternalClass
ます。DrawingThread
を投稿し、Canvas
待機に戻ります。
私の予想される動作は、連続したタッチで画面にドットが蓄積されることです。代わりに、タッチするたびに画面がクリアされ、最後に画面に触れた場所の背景とちょうど 1 つのドットが残ります。
lockCanvas(Rect)
「ダーティ」セクションを指定することでロック間の変更を保存すると具体的に述べているため、これは非常に紛らわしいと思います。Google で検索したところ、ほとんどのユーザーは逆の問題を見つけているように思えましたView
。
SurfaceView
再描画する「ダーティ」セクションを指定したにもかかわらず、UI の更新ごとにプログラムが最初からきれいに描画されるのはなぜですか?
プログラマーがビットマップを使用するようにアドバイスされたこの以前に回答された質問について、誰かが私に言及することは間違いありません。これは、私がこれに慣れていないことと、大量のメモリで動作したくないという理由から、これを回避しようとしています (UI の更新はコードのごく一部です)。単純な形状を で直接操作するのView
は、私にとって理想的です。さらに、回避策として提示されます。これは Android API の欠陥ですか?
こことGoogleを数時間検索しています。露骨に明白なものを見逃していないことを願っています。