位图更改将使onDraw()之前的视图自动刷新,并且无论是否发生无效调用

时间:2013-09-27 14:13:07

标签: android canvas bitmap

我有一个关于View.onDraw()的奇怪问题,我有一个Canvas用Bitmap绘制一些文本,在onDraw方法中,我绘制Bitmap使用View hold Canvas。当用户触摸时,我调用 startDragging 然后对Bitmap进行一些更改,但我从不执行 View.invalidate(),我认为Bitmap的任何更改都不会影响BoardView用户界面,因为我没有使其无效以进行刷新,但是在没有 onDraw()调用的情况下刷新了Bitmap 的新更改,我在onDraw第一行设置了一个断点,调试,但onDraw没有调用。之后,我在startDragging()之后调用invalidate(),我在第一行调用onDraw时停止但是我看到BoardView已经刷新了。
我不知道他们在onDraw()之前做了什么,Canvas会不会知道我改变Bitmap并立即使用它?我认为所有UI更改都会调用onDraw方法,它可以控制如何更改,是不是我错了?

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class BoardView extends View {
    public BoardView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private Bitmap mMainPageBitmap;
    private Canvas mDrawableCanvas;

    @Override
    protected void onDraw(Canvas canvas) {
        if (mMainPageBitmap == null) initDrawing(canvas.getWidth(), canvas.getHeight());
        canvas.drawBitmap(mMainPageBitmap, 0, 0, null);
    }

    private void initDrawing(int width, int height) {
        mMainPageBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        mDrawableCanvas = new Canvas();
        drawCurrentPage();
    }

    private void drawCurrentPage() {
        mDrawableCanvas.setBitmap(mMainPageBitmap);

        mDrawableCanvas.save(Canvas.MATRIX_SAVE_FLAG);
        mDrawableCanvas.translate(10, 20);

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.BLUE);
        paint.setTextSize(30);

        mDrawableCanvas.drawLine(0, 50, getWidth(), 50, paint);
        mDrawableCanvas.drawText("test", 0, 4, 0, 0, paint);

        mDrawableCanvas.restore();
    }

    public void startDragging() {
        drawCurrentPage();
        // invalidate();
    }
}

我有另一个项目做了同样但没有这个问题,我仔细比较然后我发现有关Canvas实例的onDraw方法有一点区别。工作好的版本是使用 android.view.Surface $ CompatibleCanvas ,而工作错误的版本是使用 android.view.GLES20RecordingCanvas ,我不再有OpenGL调用了,所以我不知道它为什么用,这有什么不同让我错了? CompatibleCanvas

RecordingCanvas

--------------- 更新1 ---------------
我看着Android View Drawing,他们说“如果你为View设置了一个背景可绘制,那么View会在回调它的onDraw()方法之前为你绘制它”,所以我确认我没有'设置背景以既不查看XML定义,也不以编程方式查看。

Android 2d-graphics说“Android框架只会根据需要调用onDraw()”,框架是否考虑更改Bitmap是不必调用onDraw()?

1 个答案:

答案 0 :(得分:0)

我认为我犯了一个愚蠢的错误,我设置 android:targetSdkVersion = 16所以平台编译我的源代码为API级别16,我将其更改为10然后解决问题,非常非常愚蠢。

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" />