getDrawingCache()返回Bitmap未更新

时间:2013-10-05 23:04:41

标签: java android bitmap android-canvas

我有一个自定义视图,可以管理数百个离散的用户定义顺序绘图事件。在每次onDraw期间,我不是维护所有单个文本,线条,形状更新的集合,然后重新绘制它们,而是在每个onDraw的末尾抓取画布的Bitmap,然后使用该Bitmap开始下一个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 is not updated似乎是相关的,但基于该用户自己发现的答案,显然这不是同一个问题。

运行此自定义视图时,触摸屏幕会在您触摸的位置显示“1”。然后它捕获画布的位图,其中包含“1”。后续触摸重新显示存储在mPrevCanvas中的Bitmap(在同一位置再次显示“1”),然后表示当前触摸事件的新数字(例如,“2”,“3”等)因为我很清爽mPrevCanvas在每个onDraw的末尾,我希望每个onDraw开始时显示一个包含所有先前触摸事件结果的Bitmap ...但由于某种原因,mPrevCanvas Bitmap永远不会更新为包含除初始事件之外的任何内容( “1”)。

我已经(a)验证了isDrawingCacheEnabled()在每次通过onDraw时仍然为true; (b)试图抛出destroyDrawingCache()和buildDrawingCache()无济于事; (c)在调用getDrawingCache()之前强制mPrevCanvas为null,以确保它真正得到更新; (d)在预感中通过我的O'Reilly的Java副本搜索我可能有一个java顶空问题而不是Android API问题。

Q1:为什么getDrawingCache()只返回一个包含第一次调用canvas.drawText的Bitmap,但是从不带有任何后续drawText调用的结果?

Q2:鉴于我这样做是为了提高资源效率,我还应该使用其他一些设计模式吗?

1 个答案:

答案 0 :(得分:2)

即使为时太晚而无法回复此问题,我认为这可以帮助有人搜索这个以纠正答案。

same question here (with reply)