Implementing Undo in FingerPaint
I know there are already too many questions about that. but i have been
trying a lot for few days and nothing is working for me. I am posting the
parts of code and results (only relevant) that might help you
understanding the problem.
public class Canvass extends View {
private ArrayList<Path> paths = new ArrayList<Path>();
private ArrayList<Path> undonePaths = new ArrayList<Path>();
private Path path = new Path();
public Canvass(Context context) {
super(context);
paths.add(path);
}
public void onSizeChanged(int w, int h, int oldW, int oldH)
{
super.onSizeChanged(w, h, oldW, oldH);
myBitmap = Bitmap.createBitmap(getWidth(), getHeight(),
Bitmap.Config.ARGB_8888);
bitmapCanvas = new Canvas(myBitmap);
bitmapCanvas.drawColor(bcolor);
}
protected void onDraw(Canvas canvas)
{ //ON DRAW
if(undo) // I made boolean undo=true on Undo button's
onTouch event
{
onClickUndo();
undo=false;
}
canvas.drawBitmap(myBitmap, 0, 0, paint);
for (Path p : paths)
{canvas.drawPath(p, opaint);
invalidate();
}
On Touch Event
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchStarted(x,y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touchMoved(x,y);
invalidate();
break;
case MotionEvent.ACTION_UP:
touchEnded();
invalidate();
break;
}
return true;
}
Touch Start
private void touchStarted(float x, float y)
{
path.reset();
path.moveTo(x, y);
paths.add(path);
mX = x;
mY = y;
}
Touch Move
private void touchMoved(float x, float y)
{
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE)
{
path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
mX = x;
mY = y;
}
}
Touch End
private void touchEnded()
{
path.lineTo(mX, mY);
bitmapCanvas.drawPath(path, opaint);
path.reset();
path = new Path();
paths.add(path);
}
And My UNDO method
public void onClickUndo () {
//UNDO
if (paths.size()>0)
{
undonePaths.add(paths.remove(paths.size()-1));
String s=String.valueOf(paths.size());
Toast.makeText(getContext(), s, Toast.LENGTH_SHORT).show();
invalidate();
}
else
Toast.makeText(getContext(), "fghg",
Toast.LENGTH_SHORT).show();
}
Now, The results I get by clicking undo buttons:- I don't get any of the
line removed, but I do get the toast consisting String "s" (String
s=String.valueOf(paths.size());)
When i draw one line and press "undo", "s" is increased by 1 every time.
but when I draw two lines and press "undo", "s" is increased by 3.
I have tried different solutions but nothing seems to be working... please
help
No comments:
Post a Comment