java - getDrawingCache() 返回的位图未更新

标签 java android bitmap android-canvas

我有一个自定义 View ,它将管理数百个离散的用户定义的顺序绘图事件。我不是维护所有单个文本、线条、形状更新的集合,然后在每次 onDraw 期间重新绘制它们,而是在每次 onDraw 结束时获取 Canvas 的位图,然后使用该位图启动下一个 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似乎相关,但根据该用户自己发现的答案,这显然不是同一个问题。

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

我已经 (a) 验证了 isDrawingCacheEnabled() 在每次通过 onDraw 时仍然为真; (b) 尝试投入 destroyDrawingCache() 和 buildDrawingCache() 无济于事; (c) 在调用 getDrawingCache() 之前强制 mPrevCanvas 为 null 以确保它真的得到更新; (d) 搜索了我的 O'Reilly's Java in a Nutshell 副本,预感我可能遇到了 Java headspace 问题而不是 Android API 问题。

问题 1:为什么 getDrawingCache() 只返回包含 第一次 对 canvas.drawText 的调用的位图,而不会返回任何后续 drawText 调用的结果?

问题 2:考虑到我这样做是为了提高资源效率,我是否应该使用其他一些设计模式?

最佳答案

即使回复这个为时已晚,我认为它可以帮助搜索此问题的人更正答案。

same question here (with reply)

关于java - getDrawingCache() 返回的位图未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203632/

相关文章:

c - 数组中的位图更改值

java - 未找到方案 : mongodb 的组件

Java JApplet 图形双缓冲

android - 如何使用 Rect.intersect 方法。

android - 缩放位图的方法之间的区别

android - 如何在没有伪影的情况下使用 Renderscript 模糊效果?

java - 动态更改 Tab UIID 在 codenameone 中无法正常工作

java - 读取实体 A 时从实体 B 读取值(在非 PK 列上左连接)- JPA 2.0

android - Android 中的设计说明。列出 Activity 与 Activity

android - Google Play 安全警报 - 您的应用使用了不安全的 HostnameVerifier 实现