• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

How to erase line dawn on a canvas

Anshumanb

Lurker
I am using a Canvas class to draw lines on the canvas. Now i want to erase line drawn in the canvas in the similar way as we do in our notebook using erase. I go through several example but nothing works for me. Actually in my case I am using a layout called canvas Container. To that layout i am adding the Canvas view using addView() method. The layout in which i add canvas view had a background image and that background image changes based on theme, means if the user change the theme, the background image of the layout also changes, So because of that, i can't simply erase the line by setting the paint color similar to that background image color. So I am not able to configure how to do eraser thing in this type of situation.

If anyone know the solution of this problem, please help me to solve this out.

xml File

[HIGH]<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp">

<LinearLayout
android:id="@+id/canvas_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</LinearLayout>

</RelativeLayout>[/HIGH]

Java Code

[HIGH]public class DrawView extends View implements OnTouchListener
{
private Canvas m_Canvas;

private Path m_Path;

private Paint m_Paint;

ArrayList<Pair<Path, Paint>> paths = new ArrayList<Pair<Path, Paint>>();

ArrayList<Pair<Path, Paint>> undonePaths = new ArrayList<Pair<Path, Paint>>();

private float mX, mY;

private static final float TOUCH_TOLERANCE = 4;

private Bitmap bitmapToCanvas;

private CanvasManager m_CanvasManagerObject;

private Paint mBitmapPaint;

public DrawView(Context context)
{
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);

onCanvasInitialization();
}

public void onCanvasInitialization()
{
m_Paint = new Paint(Paint.DITHER_FLAG);
m_Paint.setAntiAlias(true);
m_Paint.setDither(true);
m_Paint.setColor(Color.parseColor("#37A1D1"));
m_Paint.setStyle(Paint.Style.STROKE);
m_Paint.setStrokeJoin(Paint.Join.ROUND);
m_Paint.setStrokeCap(Paint.Cap.ROUND);
m_Paint.setStrokeWidth(2);
m_Path = new Path();

mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);

bitmapToCanvas = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
m_Canvas = new Canvas(bitmapToCanvas);
}

@Override
protected void onDraw(Canvas canvas)
{
canvas.drawBitmap(bitmapToCanvas, 0f, 0f, mBitmapPaint);
canvas.drawPath(m_Path, m_Paint);
}

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

private void touch_start(float x, float y)
{
m_Path.reset();
m_Path.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)
{
m_Path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
mX = x;
mY = y;
}
}

private void touch_up()
{
m_Path.lineTo(mX, mY);

// commit the path to our offscreen
m_Canvas.drawPath(m_Path, m_Paint);

// kill this so we don't double draw
Paint newPaint = new Paint(m_Paint); // Clones the mPaint object
paths.add(new Pair<Path, Paint>(m_Path, newPaint));
m_Path = new Path();
}

public void onClickEraser()
{

}

}[/HIGH]
 
I dont know if you have a solution but if not i provide u one..

Create a method when u can add the:
urPAint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)) property to ur Paint Class.
With a simple boolean flag u can add or not this property to ur paint..
Example:
Inside the ontoch event.. when we get the action DOWN , verify if true then add erase else set the value on urPaint.setXfermode(null) and drawing normally.

I hope u can understand me cos my english isn`t good yet. D
 
Back
Top Bottom