我正在尝试更改自定义View的背景图片并取得一些成功。图像会改变,但问题是我仍然看到旧图像的痕迹。当我在绘制新图像之前尝试清除画布时,它似乎不起作用。我创建一个位图来存储图像。在更改图像时,我在绘制新图像之前调用Canvas.drawColor(),但旧图像仍然存在。我已经尝试过drawColor(0),drawColor(Color.BLACK),c.drawColor(0,PorterDuff.Mode.CLEAR),并且没有上述工作。因此,我不得不发表这篇文章,以便从比我更有经验的思想中进行审核。
实际代码如下:
private int bgnd;
private boolean switching;
public void setBgnd(int incoming){
switching = true;
switch (incoming){
case R.drawable.image1:
bgnd = incoming;
this.invalidate();
break;
case R.drawable.image2:
bgnd = incoming;
this.invalidate();
break;
}
}
protected void onDraw(Canvas c){
if(switching == true){
Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd);
c.drawColor(0, PorterDuff.Mode.CLEAR);
c.drawBitmap(b, 0, 0, null);
switching = false;
}else{
Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd);
c.drawBitmap(b, 0, 0, null);
}
}
答案 0 :(得分:30)
就像你一样,我在多层/平面视图应用程序中努力清除顶层/平面视图。经过2天的搜索和编码,我发现了自己的方式,这是我在绘制前清除画布的方法,你可以在有多个图层/表面视图时使用它。背景图层不会被黑色覆盖,这就是诀窍。
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
canvas.drawPaint(paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
// start your own drawing
答案 1 :(得分:2)
您是否还需要在onDraw方法中调用invalidate(),以便在屏幕上更新onDraw中所做的更改?
在你调用setBgnd之后,你的开关中的invalidate()会调用你的onDraw,但是在你对Canvas进行了更改后没有什么可以重绘的。
答案 2 :(得分:2)
您可以使用Canvas的方法drawRGB
。
答案 3 :(得分:0)
我只是遇到这个问题。
我通过重复“ ..Drawxxx(); Post();”至少3次来解决它,效果很好。
我想,“双缓冲”是原因,有时是“三重缓冲”。我们需要重复绘制以确保每个“缓冲”都已更新。.