13

我正在尝试成功更改自定义视图的背景图像。图像会改变,但问题是我仍然看到旧图像的痕迹。当我尝试在绘制新图像之前清除画布时,它似乎不起作用。我创建一个位图来存储图像。更改图像时,我在绘制新图像之前调用 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

4 回答 4

31

就像你一样,我在如何清除我的多层/surfaceview 应用程序中的顶层/surfaceview 时遇到了困难。经过 2 天的搜索和编码,我找到了自己的方式,这就是我在绘制之前清除画布的方式,您可以在具有多个图层/表面视图时使用它。背景层不会被黑色覆盖,这就是诀窍。

Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
canvas.drawPaint(paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
// start your own drawing
于 2011-08-09T10:56:45.280 回答
3

您可以使用 Canvas 的方法drawRGB

于 2011-12-10T05:08:02.560 回答
2

您是否也不需要在 onDraw 方法中调用 invalidate(),以便在该 onDraw 中所做的更改在屏幕上更新?

在你调用 setBgnd 之后,你的 switch 中的 invalidate() 将调用你的 onDraw,但是在你对 Canvas 进行更改之后,没有什么要重新绘制的。

于 2011-01-10T19:51:00.283 回答
0

我刚遇到这个问题。

我通过重复“..Drawxxx();Post();”来解决它 至少3次,效果很好。

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

于 2018-08-23T00:12:51.357 回答