Java canvas.drawBitmap仅绘制上次修改的位图,而不是中间位图

Java canvas.drawBitmap仅绘制上次修改的位图,而不是中间位图,java,android,canvas,view,Java,Android,Canvas,View,在我的个人输入法中,我使用一个小的可变位图进行临时绘制(带有画布),然后我将这个位图绘制成一个更大的位图。这在SurfaceView上很好地工作,使用单独的线程进行绘制。由于种种原因,我目前正在重新编写代码,以便在UI线程上绘制,使用View而不是SurfaceView。问题是,当我使用画布绘制小位图,然后将小位图绘制成大位图,并使此过程成倍增加,就像bitmapcall只绘制小位图的最后修改一样 这是我为展示给你们而制作的一段代码 public class TestBMP extends Vi

在我的个人输入法中,我使用一个小的可变位图进行临时绘制(带有画布),然后我将这个位图绘制成一个更大的位图。这在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);
        }

    }
}
public类TestBMP扩展视图{
私有位图bmp;
私人帆布bmpCanvas;
私人油漆;
公共测试BMP(上下文){
超级(上下文);
init();
}
公共测试BMP(上下文,属性集属性){
超级(上下文,attrs);
init();
}
公共测试BMP(上下文上下文、属性集属性、int-defStyleAttr){
super(上下文、attrs、defStyleAttr);
init();
}
私有void init(){
油漆=新油漆();
油漆。设置颜色(颜色。黑色);
Bitmap.Config conf=Bitmap.Config.ARGB_8888;
bmp=Bitmap.createBitmap(128128,conf);
bmpCanvas=新画布(bmp);
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
if(canvas.getHeight()==0)
返回;
int max=3;
对于(int i=0;i
如果在“活动”(或自定义输入法)中执行此操作,则会有3个红色方框,带有文本“T:2”,而不是预期的结果(T:0--T:1--T:2)。谢谢

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

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

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
一切都如预期的那样。我想这样画画会慢一些,但对我来说很合适


我猜multiples drawBitmap正在画布上缓存对位图的引用,因此,如果我更改位图,draw调用将指向同一个修改后的位图。在onDraw方法的末尾,上次修改中绘制的是相同的位图,而不是连续的更改

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

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
一切都如预期的那样。我想这样画画会慢一些,但对我来说很合适

我猜multiples drawBitmap正在画布上缓存对位图的引用,因此,如果我更改位图,draw调用将指向同一个修改后的位图。在onDraw方法的末尾,上次修改中绘制的是相同的位图,而不是连续的更改