0

Undo and redo functionality NOT working with below code. Below is the my drawing code implementation.

Is there any problem in below code?

public class DrawingArea extends View {
 private Path drawPath;
 private Paint drawPaint, canvasPaint;
 private int paintColor = 0xFF660000;
 private Canvas drawCanvas;
 private Bitmap canvasBitmap;
 private ArrayList paths = new ArrayList();
 private ArrayList undonePaths = new ArrayList();
 private float mX, mY;
 private static final float TOUCH_TOLERANCE = 4;
 // for Undo, Redo
 private int historyPointer = 0;
 private boolean erase = false;
 public DrawingArea(Context context) {
 super(context);
 setupDrawing();
 }
 public DrawingArea(Context context, AttributeSet attrs) {
 super(context, attrs);
 setupDrawing();
 }
 public void setupDrawing() {
 drawPath = new Path();
 drawPaint = new Paint();
 drawPaint.setAntiAlias(true);
 drawPaint.setStrokeWidth(20);
 drawPaint.setStyle(Paint.Style.STROKE);
 drawPaint.setStrokeJoin(Paint.Join.ROUND);
 drawPaint.setStrokeCap(Paint.Cap.ROUND);
 canvasPaint = new Paint(Paint.DITHER_FLAG);
 //paths.add(drawPath);
 }
 public void setColor(String newColor) {
 invalidate();
 paintColor = Color.parseColor(newColor);
 drawPaint.setColor(paintColor);
 }
 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
 canvas.drawPath(drawPath, drawPaint);
 }
 @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);
 drawCanvas = new Canvas(canvasBitmap);
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
 float x = event.getX();
 float y = event.getY();
 switch (event.getAction()) {
 case MotionEvent.ACTION_DOWN:
 touch_start(x, y);
 invalidate();
 break;
 case MotionEvent.ACTION_MOVE:
 touch_move(x, y);
 invalidate();
 break;
 case MotionEvent.ACTION_UP:
 touch_up();
 invalidate();
 break;
 }
 return true;
 }
 private void touch_start(float x, float y) {
 drawPath.reset();
 drawPath.moveTo(x, y);
 mX = x;
 mY = y;
 }
 private void touch_move(float x, float y) {
 float dx = Math.abs(x - mX);
 float dy = Math.abs(y - mY);
 if (dx>= TOUCH_TOLERANCE || dy>= TOUCH_TOLERANCE) {
 drawPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
 mX = x;
 mY = y;
 }
 }
 private void touch_up() {
 drawPath.lineTo(mX, mY);
 // commit the path to our offscreen
 drawCanvas.drawPath(drawPath, drawPaint);
 // kill this so we don't double draw
 drawPath = new Path();
 paths.add(drawPath);
 }
 public void setErase() {
 canvasBitmap.eraseColor(Color.TRANSPARENT);
 drawPath.reset();
 invalidate();
 }
 public void startNew() {
 drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
 invalidate();
 }
 public void undo() {
 if (paths.size()> 0) {
 undonePaths.add(paths.remove(paths.size() - 1));
 invalidate();
 }
 }
 public void redo() {
 if (undonePaths.size()> 0) {
 paths.add(undonePaths.remove(undonePaths.size() - 1));
 invalidate();
 }
 }
}
asked May 22, 2016 at 15:27

1 Answer 1

1

Change your OnDraw() like this

protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 canvas.drawBitmap(mBitmap, 0, 0, canvasPaint);
 canvas.drawPath(mPath,drawPaint);
 for (Path p : paths) {
 canvas.drawPath(p, drawPaint);
 }
}

and don't forget to add type of data hold by paths arraylist

ArrayList<Path> paths = new ArrayList<Path>();
answered Aug 25, 2016 at 7:20
Sign up to request clarification or add additional context in comments.

1 Comment

But without drawing the bitmap. The paths are being drawn onto the bitmap, so any "undo"s do no affect the underlying bitmap.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.