Android 位图更改将使视图在onDraw()和invalidate调用之前自动刷新

Android 位图更改将使视图在onDraw()和invalidate调用之前自动刷新,android,canvas,bitmap,Android,Canvas,Bitmap,我对View.onDraw()有一个奇怪的问题,我有一个画布,可以用位图绘制一些文本,在onDraw方法中,我使用View hold画布绘制位图。当用户触摸时,我调用开始拖动,然后对位图进行一些更改,但我从未执行查看.无效(),我认为位图的任何更改都不会影响BoardView UI,因为我没有使其无效以刷新,但它会立即使用位图的新更改进行刷新,而无需onDraw()调用时,我在onDraw的第一行设置了一个断点并进行了调试,但onDraw没有调用。在那之后,我在startDraging()之后调

我对View.onDraw()有一个奇怪的问题,我有一个画布,可以用位图绘制一些文本,在onDraw方法中,我使用View hold画布绘制位图。当用户触摸时,我调用开始拖动,然后对位图进行一些更改,但我从未执行查看.无效(),我认为位图的任何更改都不会影响BoardView UI,因为我没有使其无效以刷新,但它会立即使用位图的新更改进行刷新,而无需onDraw()调用时,我在onDraw的第一行设置了一个断点并进行了调试,但onDraw没有调用。在那之后,我在startDraging()之后调用invalidate(),在第一行停止onDraw调用,但我看到BoardView已经刷新了。
我不知道他们在onDraw()之前做了什么,Canvas会知道我更改位图并立即使用它吗?我认为所有的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方法有一点不同。工作良好的版本是useandroid.view.Surface$compatibleCavas,而工作错误的版本是useandroid.view.GLES20RecordingCanvas,我不再使用OpenGL调用了,所以我不知道为什么要使用它,这种差异是否让我错了?

---------------更新1--------------
我在看,他们说“如果你为一个视图设置了一个可绘制的背景,那么该视图将在调用其onDraw()方法之前为你绘制它”,所以我已经确认我没有将背景设置为以XML定义或编程方式查看。


所说的“Android框架只需要调用OnDRAW()”,框架是否考虑更改位图是不必要的调用()?< P/> < P>我认为我犯了一个愚蠢的错误,我设置了<强> Android:ToalStdkValue< /St>> 16,所以将我的源代码编译为API级别16,我把它改为10,然后解决问题,非常非常愚蠢

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