何百もの個別のユーザー定義の順次描画イベントを管理するカスタム ビューがあります。個々のテキスト、線、形状の更新のすべてのコレクションを維持し、各 onDraw 中にそれらをすべて再描画するのではなく、各 onDraw の最後にキャンバスのビットマップを取得し、そのビットマップで次の onDraw を開始します。私の問題の説明は、このスニペットに従います。
public class TestView extends View implements OnTouchListener {
private Paint mPaint;
private Bitmap mPrevCanvas;
private int mTouchCount = 0;
float mX = 50f;
float mY = 50f;
public TestView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
this.setDrawingCacheEnabled(true);
mPaint = new Paint();
mPaint.setTextSize(30f);
}
@Override
protected void onDraw(Canvas canvas) {
if (mTouchCount == 0) {
canvas.drawText("Touch screen to begin", 50f, 100f, mPaint);
} else {
if (mPrevCanvas != null) {
canvas.drawBitmap(mPrevCanvas, 0, 0, mPaint);
}
canvas.drawText(Integer.toString(mTouchCount), mX, mY, mPaint);
mPrevCanvas = getDrawingCache().copy(Bitmap.Config.ARGB_8888, false);
}
}
public boolean onTouch(View arg0, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
mX = event.getX();
mY = event.getY();
mTouchCount += 1;
invalidate();
}
return true;
}
}
最初のタッチ イベントでは問題なく動作しているように見えますが、mPrevCanvas が再び更新されることはありません。getDrawingCache() に関連する以前の質問を確認すると、 getDrawingCache が更新されていないだけが関連しているように見えましたが、そのユーザーの自己発見した回答に基づいて、それは明らかに同じ問題ではありませんでした。
このカスタム ビューを実行している場合、画面をタッチすると、タッチした位置に「1」が表示されます。次に、その「1」を含むキャンバスのビットマップをキャプチャします。後続のタッチは、mPrevCanvas に保存されているビットマップを再表示し (同じ位置に「1」を再度表示)、現在のタッチ イベントを表す新しい番号 (「2」、「3」など) を再表示します。各 onDraw の最後に mPrevCanvas、私は各 onDraw が以前のすべてのタッチ イベントの結果を含むビットマップを表示することから始まることを期待しています...しかし、何らかの理由で、mPrevCanvas ビットマップは決して更新されず、最初のイベント ( "1")。
(a) onDraw を通過するたびに isDrawingCacheEnabled() が true であることを確認しました。(b) destroyDrawingCache() と buildDrawingCache() をスローしようとしましたが、役に立ちませんでした。(c) getDrawingCache() を呼び出す前に mPrevCanvas を強制的に null にして、実際に更新されていることを確認します。(d) 私のコピーの O'Reilly の Java in a Nutshell を検索したところ、Android API の問題ではなく、Java ヘッドスペースの問題があるのではないかと思いました。
Q1: getDrawingCache() が canvas.drawTextへの最初の呼び出しを含むビットマップのみを返し、その後の drawText 呼び出しの結果を決して返さないのはなぜですか?
Q2: リソースの効率化のためにこのようにしていることを考えると、とにかく他の設計パターンを使用する必要がありますか?