使用Canvas.drawColor()清除画布

时间:2011-01-10 19:40:03

标签: android canvas ondraw

我正在尝试更改自定义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);
    }
}

4 个答案:

答案 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次来解决它,效果很好。

我想,“双缓冲”是原因,有时是“三重缓冲”。我们需要重复绘制以确保每个“缓冲”都已更新。.