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

Posted

技术标签:

【中文标题】canvas.drawBitmap 仅绘制最后修改的位图,不绘制中间图【英文标题】:canvas.drawBitmap draws only last modified bitmap, not intermediates 【发布时间】:2019-04-30 02:35:38 【问题描述】:

在我个人的输入法中,我使用一个小的可变位图进行临时绘制(使用画布),然后我将这个位图绘制成一个更大的位图。这在 SurfaceView 上运行良好,使用单独的线程进行绘图。由于某些原因,我目前正在修改代码以在 UI 线程上进行绘制,使用 View 而不是 SurfaceView。问题是当我使用画布绘制小位图,然后将小位图绘制到更大的位图,并使这个过程多次,就像位图调用只绘制小位图的最后一次修改。

这是我为您制作的一小段代码

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)。谢谢。

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

【问题讨论】:

【参考方案1】:

嗯...我回答我的问题。这似乎与硬件加速有关。我可以使用

在视图级别禁用它
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

一切都按预期工作。我想这样绘图会更慢,但对我有用。

我的猜测是多个 drawBitmap 缓存在画布上并引用位图,因此,如果我更改位图,绘图调用将指向相同的修改位图。和 onDraw 方法结束时一样,最后一次修改绘制的是相同的位图,而不是连续的变化。

【讨论】:

以上是关于canvas.drawBitmap 仅绘制最后修改的位图,不绘制中间图的主要内容,如果未能解决你的问题,请参考以下文章

自定义组件之绘制图片

Android面试收集录 2D绘图与动画技术

canvas.drawBitmap()的三个最常用的调用方法, 以及Matrix类的使用

Android绘图基础--Canvas和Drawable

自定义控件练习:drawBitmap显示长图

画布绘制位图?