如何实现绘图的同时撤消和擦除

时间:2014-02-20 00:53:16

标签: android path drawing android-drawable erase

我可以让Erasing工作但无法撤消工作 我可以让撤消工作,但擦除无法工作。

我已多次尝试弄清楚它为什么会这样做。但我没有成功。

这是我的Drawing类:

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.util.Log;    
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class DrawingView extends View {

//drawing path
private Path drawPath;
    //drawing and canvas paint
private Paint drawPaint, canvasPaint;
//initial color
private int paintColor = 0xFF660000;
//canvas
private Canvas drawCanvas;
private Canvas backUp;

//canvas bitmap
private Bitmap canvasBitmap;
private Bitmap backUpBitmap;

private float brushSize;

private boolean erasing;

private ArrayList<Path> paths = new ArrayList<Path>();
private ArrayList<Integer> paints = new ArrayList<Integer>();

public DrawingView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setupDrawingView(); 
}

private void setupDrawingView() {

    drawPath = new Path();

    drawPaint = new Paint();
    drawPaint.setColor(paintColor);
    drawPaint.setAntiAlias(true);
    drawPaint.setDither(true);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);

    canvasPaint = new Paint(Paint.DITHER_FLAG);

    brushSize = 5;

    drawPaint.setStrokeWidth(brushSize);

    erasing = false;

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    backUpBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    drawCanvas = new Canvas(canvasBitmap);
    backUp = new Canvas(backUpBitmap);
}

@Override
protected void onDraw(Canvas canvas) {

    for(int i = 0; i < paths.size(); i++) {
        Integer j = paints.get(i);
        Paint p = new Paint();

        p.setColor(j.intValue());
        p.setAntiAlias(true);
        p.setDither(true);
        p.setStyle(Paint.Style.STROKE);
        p.setStrokeJoin(Paint.Join.ROUND);
        p.setStrokeCap(Paint.Cap.ROUND);
        p.setXfermode(null);
        p.setStrokeWidth(5);

        canvas.drawPath(paths.get(i), p);
    }

    drawPaint.setColor(paintColor);

    if(erasing) 
        drawPaint.setXfermode(new      PorterDuffXfermode(PorterDuff.Mode.CLEAR));

    canvas.drawPath(drawPath, drawPaint);
    canvas.drawBitmap(canvasBitmap, 0, 0, drawPaint);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        drawPath.moveTo(touchX, touchY);
        backUp.drawBitmap(canvasBitmap, 0, 0, null);
        invalidate();
        break;
    case MotionEvent.ACTION_MOVE:
        drawPath.lineTo(touchX, touchY);
        invalidate();
        break;
    case MotionEvent.ACTION_UP:

        drawCanvas.drawPath(drawPath, drawPaint);

        if(!erasing) {

            paints.add(paintColor);
            paths.add(drawPath);

            drawPath = new Path();
        }

        drawPath.reset();

        invalidate();
        //drawPath = new Path();
        break;
    default:
        return false;
    }

    invalidate();
    return true;
}

public void setColor(String newColor) {

    invalidate();

    paintColor = Color.parseColor(newColor);
    drawPaint.setColor(paintColor);
}

public void setColor(int color) {

    invalidate();

    drawPaint.setColor(color);
}

public void setErase(boolean erase){
    Mode x = PorterDuff.Mode.CLEAR;

    erasing = erase;

    if(erase) {
        drawPaint.setXfermode(new PorterDuffXfermode(x));

    } else {
        drawPaint.setXfermode(null);
        drawPaint.setColor(0xFF000000);
    }

    drawCanvas.drawPath(drawPath, drawPaint);
}

public void reset() {
    drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
    invalidate();

    drawPath.reset();    

    paths.clear();
    paints.clear();
}

public void setBrushSize(float newSize) {

    brushSize = newSize;

    drawPaint.setStrokeWidth(newSize);
}

public void undo () { 

    if (paths.size() > 0) { 

        Path undoPath = paths.get(paths.size()-1);
        undoPath.reset();

        paths.remove(paths.size() -1);

        paints.remove(paints.size()-1);

        drawCanvas.drawBitmap(canvasBitmap, 0, 0, null);

        invalidate();
    } else {
        Toast.makeText(getContext(), "Cannot Undo", Toast.LENGTH_SHORT).show();
    }

    }

public int getPaths() {
    return paths.size();
}
}

1 个答案:

答案 0 :(得分:-1)

每次绘制并将其保存在堆栈上时创建一个新路径,通过从堆栈中弹出路径来撤消

相关问题