我可以让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();
}
}
答案 0 :(得分:-1)
每次绘制并将其保存在堆栈上时创建一个新路径,通过从堆栈中弹出路径来撤消