Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 画布中的橡皮擦,android中的重做/撤消选项_Java_Android_Android Canvas - Fatal编程技术网

Java 画布中的橡皮擦,android中的重做/撤消选项

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

我正在开发一个绘图应用程序,我想实现橡皮擦功能,使用重做/撤消选项进行操作。我已经查看了一些示例,但不幸的是我无法实现橡皮擦。我使用了paint.setXfermode(新PorterDuffXfermode(PorterDuff.Mode.CLEAR))进行擦除,但它不起作用

注意:在我的情况下,橡皮擦工作正常,但重做/撤消不工作,我希望两者都能正常工作。

我的代码:

//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;
    }
}