Java 画布中的橡皮擦,android中的重做/撤消选项
我正在开发一个绘图应用程序,我想实现橡皮擦功能,使用重做/撤消选项进行操作。我已经查看了一些示例,但不幸的是我无法实现橡皮擦。我使用了paint.setXfermode(新PorterDuffXfermode(PorterDuff.Mode.CLEAR))进行擦除,但它不起作用 注意:在我的情况下,橡皮擦工作正常,但重做/撤消不工作,我希望两者都能正常工作。 我的代码:Java 画布中的橡皮擦,android中的重做/撤消选项,java,android,android-canvas,Java,Android,Android Canvas,我正在开发一个绘图应用程序,我想实现橡皮擦功能,使用重做/撤消选项进行操作。我已经查看了一些示例,但不幸的是我无法实现橡皮擦。我使用了paint.setXfermode(新PorterDuffXfermode(PorterDuff.Mode.CLEAR))进行擦除,但它不起作用 注意:在我的情况下,橡皮擦工作正常,但重做/撤消不工作,我希望两者都能正常工作。 我的代码: //Here is the I am creating Paint object... private Paint crea
//Here is the I am creating Paint object...
private Paint createPaint() {
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(this.paintStyle);
paint.setStrokeWidth(this.paintStrokeWidth);
paint.setStrokeCap(this.lineCap);
paint.setStrokeJoin(Paint.Join.MITER); // fixed
if (this.mode == Mode.ERASER) {
// Eraser
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
paint.setARGB(0, 0, 0, 0);
// paint.setColor(this.baseColor);
// paint.setShadowLayer(this.blur, 0F, 0F, this.baseColor);
} else {
// Otherwise
paint.setColor(this.paintStrokeColor);
paint.setShadowLayer(this.blur, 0F, 0F, this.paintStrokeColor);
paint.setAlpha(this.opacity);
paint.setPathEffect(this.drawPathEffect);
}
return paint;
}
//This method is for managing Redo/Undo
private void updateHistory(Path path) {
if (this.historyPointer == this.pathLists.size()) {
this.pathLists.add(path);
this.paintLists.add(this.createPaint());
this.historyPointer++;
} else {
// On the way of Undo or Redo
this.pathLists.set(this.historyPointer, path);
this.paintLists.set(this.historyPointer, this.createPaint());
this.historyPointer++;
for (int i = this.historyPointer, size = this.paintLists.size(); i < size; i++) {
this.pathLists.remove(this.historyPointer);
this.paintLists.remove(this.historyPointer);
}
}
}
private void onActionDown(MotionEvent event) {
switch (this.mode) {
case DRAW :
case ERASER :
this.updateHistory(this.createPath(event));
this.isDown = true;
default :
break;
}
}
private void onActionMove(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (this.mode) {
case DRAW :
case ERASER :
Path path = this.getCurrentPath();
switch (this.drawer) {
case PEN :
path.lineTo(x, y);
break;
default :
break;
}
break;
default :
break;
}
}
private void onActionUp(MotionEvent event) {
if (isDown) {
this.startX = 0F;
this.startY = 0F;
this.isDown = false;
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Before "drawPath"
canvas.drawColor(this.baseColor);
if (this.bitmap != null) {
canvas.drawBitmap(this.bitmap, 0F, 0F, emptyPaint);
}
for (int i = 0; i < this.historyPointer; i++) {
Path path = this.pathLists.get(i);
Paint paint = this.paintLists.get(i);
canvas.drawPath(path, paint);
}
this.canvas = canvas;
}
//这是我正在创建的绘制对象。。。
私有绘制createPaint(){
油漆=新油漆();
paint.setAntiAlias(真);
paint.setStyle(这个paintStyle);
paint.setStrokeWidth(此paintStrokeWidth);
油漆.固定行程盖(此.线盖);
paint.setStrokeJoin(paint.Join.MITER);//已修复
if(this.mode==mode.橡皮擦){
//橡皮擦
setXfermode(新的PorterDuffXfermode(PorterDuff.Mode.CLEAR));
setARGB(0,0,0,0);
//paint.setColor(此.baseColor);
//paint.setShadowLayer(this.blur,0F,0F,this.baseColor);
}否则{
//否则
paint.setColor(此.paintStrokeColor);
paint.setShadowLayer(this.blur,0F,0F,this.paintStrokeColor);
paint.setAlpha(这个是不透明度);
paint.setPathEffect(this.drawPathEffect);
}
返漆;
}
//此方法用于管理重做/撤消
私有void updateHistory(路径){
if(this.historyPointer==this.pathLists.size()){
this.pathLists.add(路径);
this.paintlist.add(this.createPaint());
这个.historyPointer++;
}否则{
//在撤消或重做的过程中
this.pathLists.set(this.historyPointer,path);
this.paintLists.set(this.historyPointer,this.createPaint());
这个.historyPointer++;
for(int i=this.historyPointer,size=this.paintLists.size();i
/**
*此方法再次绘制画布以进行撤消。
*/
公共布尔撤消(){
如果(this.historyPointer>1){
这是历史指针;
这个。使无效();
返回true;
}否则{
返回false;
}
}
/**
*此方法再次绘制画布以进行重做。
*/
公共布尔重做(){
if(this.historyPointer <代码>请显示您的代码的相关部分…@ OpIATEFUCHS,请考虑参考CavasVIEW,我在我的项目中使用这个CANVASVIEW,它还有擦除选项,但是它不工作,抱歉,但这还不够。您自己的代码中可能有一些问题…@opiatefuch请查看我正在使用的代码,这不是带有错误的代码。这是与问题无关的不同内容的一部分。
/**
* This method draws canvas again for Undo.
*/
public boolean undo() {
if (this.historyPointer > 1) {
this.historyPointer--;
this.invalidate();
return true;
} else {
return false;
}
}
/**
* This method draws canvas again for Redo.
*/
public boolean redo() {
if (this.historyPointer < this.pathLists.size()) {
this.historyPointer++;
this.invalidate();
return true;
} else {
return false;
}
}