Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to change paint color/stroke after implementing UNDO function in canvas paint
    primarykey
    data
    text
    <p>In my Paint App I have implemented UNDO function and it's working fine. But if a change the paint brush color (or) paint brush stroke then all my previous drawn paths changing to the new paint color. The code is as follows:</p> <pre><code>public class CustomView extends View implements OnTouchListener { public Canvas mCanvas; private Path mPath; public Paint mPaint, mBitmapPaint; Bitmap mBitmap; Canvas canvas; public ArrayList&lt;Path&gt; paths = new ArrayList&lt;Path&gt;(); public ArrayList&lt;Path&gt; undonePaths = new ArrayList&lt;Path&gt;(); private Bitmap im; public CustomView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); setOnTouchListener(this); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(0xFFFFFFFF); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(6); mCanvas = new Canvas(); mPath = new Path(); im = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); int w = metrics.widthPixels; int h = metrics.heightPixels; mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mBitmapPaint = new Paint(Paint.DITHER_FLAG); // mBitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { // mPath = new Path(); // canvas.drawPath(mPath, mPaint); canvas.drawColor(Color.TRANSPARENT); canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); for (Path p : paths) { canvas.drawPath(p, mPaint); } canvas.drawPath(mPath, mPaint); } private float mX, mY; private static final float TOUCH_TOLERANCE = 4; private void touch_start(float x, float y) { undonePaths.clear(); mPath.reset(); mPath.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 &gt;= TOUCH_TOLERANCE || dy &gt;= TOUCH_TOLERANCE) { mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2); mX = x; mY = y; } } private void touch_up() { mPath.lineTo(mX, mY); // commit the path to our offscreen mCanvas.drawPath(mPath, mPaint); // kill this so we don't double draw paths.add(mPath); mPath = new Path(); } public void onClickUndo() { if (paths.size() &gt; 0) { undonePaths.add(paths.remove(paths.size() - 1)); invalidate(); } else { } // toast the user } public void onClickRedo() { if (undonePaths.size() &gt; 0) { paths.add(undonePaths.remove(undonePaths.size() - 1)); invalidate(); } else { } // toast the user } @Override public boolean onTouch(View arg0, 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; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload