Android 如何对图形同时执行撤消和擦除
我可以让擦除工作,但不能让撤消工作 我可以让撤销工作,但擦除不能工作 我已经试过多次想弄清楚它为什么要这样做。但是我没有成功 这是我的绘画课:Android 如何对图形同时执行撤消和擦除,android,path,drawing,android-drawable,erase,Android,Path,Drawing,Android Drawable,Erase,我可以让擦除工作,但不能让撤消工作 我可以让撤销工作,但擦除不能工作 我已经试过多次想弄清楚它为什么要这样做。但是我没有成功 这是我的绘画课: import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphic
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();
}
}
每次绘制新路径并将其保存在堆栈上时,请通过从堆栈中弹出路径来撤消它欢迎使用堆栈溢出!请提供更多详细信息-您面临的问题到底是什么,代码的哪一部分会导致问题?你尝试过什么,为什么它没有像你预期的那样工作?另请参见:@user3330605:hi,您是否已经解决了橡皮擦和撤消/重做同时工作的问题?我遇到了同样的问题,尝试了不同的方法后无法解决,只能使用橡皮擦或撤消/重做,但不能同时使用这两种方法。请访问。非常感谢!