如何在画布上擦除先前的绘图?

23

我有一个背景图片(一张地图),需要经常在上面画“你在这里”的图标。我使用Canvas在地图顶部绘制该图标。假设绘制过程通过按钮点击触发(请参见下面的代码),我如何擦除之前的绘制?

private void displayUserPos(Point userPos) {
    Bitmap marker = BitmapFactory.decodeResource(getResources(), R.drawable.ic_yah);
    canvas.drawBitmap(marker, (float)userPos.getX(), (float)userPos.getY(), null);
    imgView.setImageBitmap(fmOverlay);
}
7个回答

49

1
如果有其他按钮点击生成的绘图,我想保留它们怎么办?有没有一种方法可以获取其ID? - springrolls
这是在这里讨论的:https://dev59.com/kG025IYBdhLWcg3w6KSO - Caner

19
canvas.drawColor(0, Mode.CLEAR);

1
当您的画布需要透明而且您无法填充白色、黑色或任何其他背景颜色时,这个功能非常有用。 - Dhruv

7
overlayBitmap.eraseColor(Color.TRANSPARENT);

这只是将现有的位图设置为完全透明。


2

只需使用颜色或图像填充画布:

canvas.drawColor(Color.BLACK);

如果您想保留某些元素并去除其他元素,可以将它们存储在一个ArrayList中。然后,您可以在需要时向该ArrayList添加和删除元素,然后在onDraw()中迭代这些元素。

for (Iterator<GraphicObject> it = _graphics.iterator(); it.hasNext();) {
    GraphicObject graphic = (GraphicObject)it.next();
    coords = graphic.getCoordinates();
    canvas.drawCircle(coords.getX(), coords.getY(), (float)coords.getRadius(), paint);
}

啊,又来了一个输入。目前我还不需要它,但以后可能会有用。谢谢!+1 - springrolls

1
尝试以下代码,它可以完全清除画布。
声明应该像这样:
ArrayList<Pair<Path, Paint>> paths = new ArrayList<Pair<Path, Paint>>();
ArrayList<Pair<Path, Paint>> undonePaths = new ArrayList<Pair<Path, Paint>>();

清除时使用

    undonePaths.clear();
    paths.clear();
    invalidate();

0
我写了一个函数来帮助处理这个问题。通常我会设置一个布尔值来检查页面是否发生了变化,如果有变化,我就调用这个函数,并使用返回的布尔值来设置我的新页面布尔值。
    private boolean clearCanvas(Canvas canvas){
      canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
      return false;
    }

在这里,Color.TRANSPARENT并不是必需的,可以不用它。


0
canvas.drawColor(0, PorterDuff.Mode.CLEAR);

欲了解更多信息请点击这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接