【问题标题】:Bitmap change will make View auto refresh before onDraw() and regardless invalidate invoke位图更改将使视图在 onDraw() 之前自动刷新,并且无论调用无效
【发布时间】:2013-09-27 14:13:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: android canvas bitmap


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      相关资源
      最近更新 更多