0

我有一个关于 View.onDraw() 的奇怪问题,我有一个用 Bitmap 绘制一些文本的 Canvas,在 onDraw 方法中,我使用 View hold Canvas 绘制该 Bitmap。当用户触摸时,我调用startDragging然后对 Bitmap 进行一些更改,但我从未执行View.invalidate(),我认为 Bitmap 的任何更改都不会影响 BoardView UI,因为我没有使其无效以刷新,但它在没有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 调用了,所以我不知道为什么使用它,这有区别吗我错了吗? 兼容画布

录音画布

--------------- update 1 ---------------
我在看Android View Drawing,他们说“如果你设置了一个背景可绘制对于视图,则视图会在回调其 onDraw() 方法之前为您绘制它”,因此我确认我没有将背景设置为查看 XML 定义或编程方式。

Android 2d-graphics说“ Android 框架只会在必要时调用 onDraw()”,框架是否认为更改 Bitmap 不需要调用 onDraw()?

4

1 回答 1

0

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

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" />
于 2013-09-29T12:50:12.153 回答