2011-08-15 40 views
2

我一直在试图改变Android(v3.0蜂巢)API Demo FingerPaint(API> = 11)以包含删除最后绘制的路径的工作擦除选项。在Android FingerPaint演示中,我如何擦除绘制的路径

在API演示擦除不能很好地工作,在V3.0崩溃,在V3.1是绘制一个黑匣子,而只有部分擦除路径(一个错误已被引发不确定是否已解决v3.2 [不适用于英国的Xoom设备])。

我的代码如下:

public void eraseLastPath() { 
    if (!mPaths.isEmpty()) { 
     mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
     mCanvas.drawPath(mPaths.pop(), mPaint); 
     invalidate(); 
    } 
} 

这个有点工作,但离开画布上绘制路径的轮廓。例如

这样的: enter image description here

被删除,看起来像这样: enter image description here

我缺少什么?有没有更好的方法来擦除路径?

任何帮助,非常感谢。

感谢

+0

@Lumis我已经设置了mPaint.setAntiAlias(true)这是造成这个问题。如果您想回答这个问题,我会将其标记为正确,并加以赞扬,以获得您的荣誉。 –

回答

3

尝试设置mPaint反别名。

编辑:

删除路径的正确方法是将所有笔划存储到一个ArrayList,然后删除不需要一个和重绘的一切。在问题中使用的方法并不是真的删除一条路径,而更像是在其上绘制另一种颜色,但是反锯齿不会像第一种颜色那样工作。

每条路径都需要是一个新类“stroke”中的成员对象,该类中还存有颜色,颜料,过滤器等。通过这种方式,所有绘图都可以恢复,并且可以进行无限撤消。

+0

..好好设置防混叠。 ;) –

+0

我认为这是与反别名,但不知道是否是导致这种影响的开或关。擦除时不会更容易不使用xfer模式,只是将路径的颜色更改为背景颜色?在这种情况下,您可以保留反别名。 – Lumis

1

保持最后得出Path(S)分别绘制(不绘制到Bitmap)。这允许您在将它们提交到支持Bitmap之前操纵Path

例如:

private List<Path> undoablePaths;  

@Override 
protected void onDraw(Canvas canvas) { 
    for(Path path : undoablePaths){ 
     canvas.drawPath(path, pathPaint); 
    } 
    canvas.drawBitmap(mainBitmap, 0, 0, bitmapPaint); 
} 

private void undoLast(){ 
    undoablePaths.remove(undoablePaths.size() - 1); 
    invalidate(); 
} 

注:的例子不允许多种颜色。您只能扩展Path对象并在其上保存颜色信息(并相应地设置Paint)。

此外,如果您将此与Honeycomb设备一起使用,请确保您已使用android:hardwareAccelerated="true"开启了硬件加速功能。

+0

感谢您的快速响应,这当然是处理绘制路径和撤消路径的另一种方式,但是Lumis指出我的Paint对象上的反锯齿是我特殊问题的原因。再次感谢。 –

+0

错误,这不是'撤消'。考虑底层路径 - 你也会画这些! –

+0

我认为这是做到这一点的正确方法 - 我不会使用路径列表作为对象,而是像PaintStroke这样的新类的列表,它将在其中放置Path对象而不是扩展路径,以及各种设置等等。公共方法。这将允许轻松操作Strokes。 – Lumis