在我的个人输入法中,我使用一个小的可变位图进行临时绘制(使用画布),然后将该位图绘制为一个较大的位图。使用单独的线程进行绘制,这在SurfaceView上效果很好。由于种种原因,我目前正在使用View而不是SurfaceView重新编写代码以在UI线程上绘制。问题是,当我使用画布绘制小位图,然后将小位图绘制到较大的位图中,并使该过程多次进行时,就像位图调用仅绘制小位图的最后修改一样。
这是我为向您展示的一小段代码
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)。谢谢。
编辑: 如果我使用一个大的位图作为具有画布大小的缓冲区,并将较小的位图绘制到该缓冲区中,最后,将该缓冲区绘制到视图的画布中,则按预期方式工作。会是什么?
答案 0 :(得分:0)
好吧...我回答了我的问题。看来这与硬件加速有关。我可以使用
在视图级别禁用它view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
所有工作都按预期进行。我想这种方式绘制起来会更慢,但是对我有用。
我的猜测是倍数drawBitmap是在画布上缓存的,并且引用了位图,因此,如果更改位图,则draw调用指向相同的修改后的位图。在onDraw方法的末尾,最后修改中的相同位图将进行绘制,而不是进行秘密更改。