我有一个自定义视图,它将管理数百个离散的用户定义的顺序绘图事件。我不是维护所有单个文本、线条、形状更新的集合,然后在每个 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 中的 Bitmap(在同一位置再次显示“1”),然后表示当前触摸事件的新数字(例如,“2”、“3”等)因为我正在刷新mPrevCanvas 在每个 onDraw 结束时,我希望每个 onDraw 首先显示一个包含所有先前触摸事件结果的位图......但由于某种原因,mPrevCanvas 位图永远不会更新以包含除初始事件之外的任何内容( “1”)。
我已经 (a) 验证了 isDrawingCacheEnabled() 在每次通过 onDraw 期间仍然为真;(b) 尝试投入 destroyDrawingCache() 和 buildDrawingCache() 无济于事;(c) 在调用 getDrawingCache() 之前强制 mPrevCanvas 为空,以确保它确实得到更新;并且 (d) 搜索了我的 O'Reilly 的 Java 简而言之副本,预感可能是我遇到了 Java 顶空问题而不是 Android API 问题。
Q1:为什么 getDrawingCache() 只返回一个包含对 canvas.drawText 的第一次调用的位图,而不会返回任何后续 drawText 调用的结果?
Q2:考虑到我这样做是为了提高资源效率,我是否应该使用其他设计模式?