canvas.drawBitmap仅绘制最后修改的位图,而不是中间体

问题描述 投票:1回答:1

在我的个人输入法中,我使用一个小的可变位图进行临时绘制(使用画布),然后我将这个位图绘制成一个更大的位图。这在SurfaceView上使用单独的线程进行绘制时效果很好。我目前正在重新编写代码以在UI线程上进行绘制,因为原因使用View而不是SurfaceView。问题是当我使用画布绘制小位图,然后将小位图绘制成较大的位图,并使此处理倍数时,就像bitmapcall只绘制小位图的最后修改一样。

这是我为您展示的一小段代码

public class TestBMP extends View {

    private Bitmap bmp;
    private Canvas bmpCanvas;
    private Paint paint;

    public TestBMP(Context context) {
        super(context);
        init();
    }

    public TestBMP(Context context,AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public TestBMP(Context context,  AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init() {
        paint = new Paint();
        paint.setColor(Color.BLACK);
        Bitmap.Config conf = Bitmap.Config.ARGB_8888;
        bmp = Bitmap.createBitmap(128,128, conf);
        bmpCanvas = new Canvas(bmp);
    }



    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (canvas.getHeight() == 0)
            return;

        int max = 3;
        for(int i = 0; i < max; i++){
            bmpCanvas.drawColor(Color.RED);
            bmpCanvas.drawText("T:"+i, 64, 64, paint );
            canvas.drawBitmap(bmp, i*(canvas.getWidth() / max), canvas.getHeight() / 2, null);
        }

    }
}

如果在Activity(或自定义输入法)中执行此操作,则有3个红色方块,文本为“T:2”而不是预期结果(T:0 --- T:1 --- T: 2)。谢谢。

编辑:如果我使用一个大位图作为缓冲区与画布大小,并将小位图绘制到此缓冲区,最后,将缓冲区绘制到视图的画布,按预期工作。它能是什么?

java android canvas view
1个回答
0
投票

嗯......我回答我的问题。这似乎与硬件加速有关。我可以在视图级别使用禁用它

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

一切都按预期进行。我想这样的绘图速度会慢一点,但对我来说很有用。

我的猜测是,drawBitmap的倍数是在画布上缓存并引用了位图,因此,如果我更改位图,则绘制调用指向相同的修改位图。并且onDraw方法的末尾,最后修改中的相同位图而不是secuential更改。

© www.soinside.com 2019 - 2024. All rights reserved.