我一直在尝试修改Android (v3.0蜂巢) API Demo FingerPaint (API >= 11),使其包含一个可以删除最后绘制的路径的有效擦除选项。
API demo中的擦除不能很好地工作,在v3.0中是崩溃,在v3.1中是绘制一个黑盒,而只是部分擦除路径(一个bug已经被提出,不确定它是否已经在v3.2中被解决,而不是在英国的Xoom设备上)。
我的代码如下:
public void eraseLastPath() {
if (!mPaths.isEmpty()) {
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mCanvas.drawPath(mPaths.pop(), mPaint);
invalidate();
}
}
这在某种程度上是可行的,但会在画布上留下所绘制路径的轮廓。例如:
这一点:
被擦除为如下所示:
我遗漏了什么?有没有更好的方法来擦除路径?
任何帮助都是非常感谢的。
谢谢
乔
发布于 2011-08-15 21:19:21
尝试将mPaint抗锯齿设置为打开。
编辑:
擦除路径的正确方法是将所有笔画存储到ArrayList中,然后删除不需要的笔画并重绘所有内容。问题中使用的方法并不是真正删除路径,而是更像是在路径上绘制另一种颜色,但抗锯齿与第一种颜色的效果不同。
每条路径都需要是一个新的“笔划”类中的成员对象,这个类还存储了颜色、颜料、滤镜等。这样,所有的绘图都可以恢复,并且可以无限地撤消。
发布于 2011-08-15 18:38:57
将上次绘制的Path
分开(不绘制到Bitmap
上)进行绘制。这允许您在将Path
提交到支持Bitmap
之前操作它们。
例如:
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
)。
此外,如果您正在使用蜂窝设备,请确保您使用android:hardwareAccelerated="true"
打开了硬件加速。
https://stackoverflow.com/questions/7063868
复制相似问题