1

I have a custom ImageView where user can draw using some colors. I load image from server then allow user to draw on top of it. When i load the next image , i want the previously drawn colors to be gone before user can draw again. I tried many thing from internet but not able to achieve the same.

below is code for custom ImageView:

public class DrawingView extends androidx.appcompat.widget.AppCompatImageView {
    //drawing path
    static Path drawPath;
    //drawing and canvas paint
    private Paint drawPaint, canvasPaint;
    //initial color
    static int paintColor = 0xFFFFFFFF;
    //stroke width
    private float STROKE_WIDTH = 5f;
    //canvas
    private Canvas drawCanvas;
    //canvas bitmap
    private Bitmap canvasBitmap;
    //eraser mode
    private boolean erase = false;
    private boolean cc = false;

    //constructor
    public DrawingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setupDrawing();
        setErase(erase);
    }


    private void setupDrawing() {
        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(paintColor);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(STROKE_WIDTH);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
        canvasPaint = new Paint(Paint.DITHER_FLAG);
    }

    //*************************************** View assigned size  ****************************************************

    @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);
    }

    public void setPaintColor(int paintColor) {
        this.paintColor = paintColor;
        setupDrawing();
    }

    public void setImageOnImageview(Bitmap canvasBitmap) {

        this.canvasBitmap = canvasBitmap;
    }

    @Override
    public void setImageResource(int resId) {
        super.setImageResource(resId);

    }

    public void setErase(boolean isErase) {
        erase = isErase;
        drawPaint = new Paint();
        if (erase) {
            setupDrawing();
            int srcColor = getResources().getColor(R.color.white);

            PorterDuff.Mode mode = PorterDuff.Mode.CLEAR;
            PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(srcColor, mode);

            drawPaint.setColorFilter(porterDuffColorFilter);

            drawPaint.setColor(srcColor);
            drawPaint.setXfermode(new PorterDuffXfermode(mode));

        } else {

            setupDrawing();

        }
    }

    //************************************   draw view  *************************************************************

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (cc) {
            canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
            canvas.drawPath(drawPath, drawPaint);

            cc = false;

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

    }


    public void clearCanvas() {
        setupDrawing();
        setErase(false);

        cc = true;
        invalidate();
    }
    //***************************   respond to touch interaction   **************************************************

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        canvasPaint.setColor(paintColor);
        float touchX = event.getX();
        float touchY = event.getY();
        //respond to down, move and up events

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_MOVE:
                drawCanvas.drawPath(drawPath, drawPaint);
                drawPath.lineTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_UP:
                drawPath.lineTo(touchX, touchY);
                drawCanvas.drawPath(drawPath, drawPaint);
                drawPath.reset();
                break;
            default:
                return false;
        }
    
        //redraw
        invalidate();
        return true;
    }

    //***********************************   return current alpha   ***********************************************
    public int getPaintAlpha() {
        return Math.round((float) STROKE_WIDTH / 255 * 100);
    }

    //**************************************  set alpha   ******************************************************
public void setPaintAlpha(int newAlpha) {
    STROKE_WIDTH = Math.round((float) newAlpha / 100 * 255);
    drawPaint.setStrokeWidth(newAlpha);
    
    }
}

enter image description here

enter image description here

I tried many solutions like clear path or clear paint. Could any please help me with this ?

RR_Pradhan
  • 78
  • 12

1 Answers1

0

I assume you want to remove the drawn color on first image upon loading the new image

I think you can draw the color over canvas

Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)

or reset the path itself

Path.reset();
hardik9850
  • 581
  • 1
  • 9
  • 26