android 画图path使用,在画图应用中,Android: 撤销功能_path_开发99编程知识库

我正在做一个绘画应用,代码如下:

DrawActivityprotected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

setContentView(R.layout.coloring_activity3);

. . ..

mv = (MyDrawView2) findViewById(R.id.drawerView);

mv.setDrawingCacheEnabled(true);

Constants.mPaint = new Paint();

Constants.mPaint.setAntiAlias(true);

Constants.mPaint.setDither(true);

Constants.mPaint.setColor(0xFF000000);

Constants.mPaint.setStyle(Paint.Style.STROKE);

Constants.mPaint.setStrokeJoin(Paint.Join.ROUND);

Constants.mPaint.setStrokeCap(Paint.Cap.ROUND);

Constants.mPaint.setStrokeWidth(Brush_size);

. . ..

case R.id.btn_eraser:

Constants.mPaint.setXfermode(null);

Constants.mPaint.setAlpha(0xFF);

Constants.mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

layout_eraser_size.startAnimation(eraser_move_from_bottom_into_screen);

layout_eraser_size.setVisibility(View.VISIBLE);

btn_eraser.setEnabled(false);

break;

case R.id.btn_brush:

layout_brush_btns.startAnimation(brush_move_from_bottom_into_screen);

layout_brush_btns.setVisibility(View.VISIBLE);

btn_brush.setEnabled(false);

break;

case R.id.btn_undo:

Constants.custom_toast(this,"undo","clicked");

mv.onClickUndo();

break;

DrawView2public class MyDrawView2 extends View

{

private Bitmap mBitmap;

private Canvas mCanvas;

private Path mPath;

private Paint mBitmapPaint;

Context context;

private ArrayList paths = new ArrayList();

private ArrayList undonePaths = new ArrayList();

public MyDrawView2(Context c, AttributeSet attrs)

{

super(c, attrs);

context = c;

mPath = new Path();

mBitmapPaint = new Paint(Paint.DITHER_FLAG);

setLayerType(View.LAYER_TYPE_SOFTWARE, null);//for solely removing the black eraser

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh)

{

super.onSizeChanged(w, h, oldw, oldh);

mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

mCanvas = new Canvas(mBitmap);

}

@Override

protected void onDraw(Canvas canvas)

{

super.onDraw(canvas);

canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

canvas.drawPath(mPath, Constants.mPaint);

}

public void onClickUndo ()

{

if (paths.size()>0)

{

undonePaths.add(paths.remove(paths.size()-1));

invalidate();

}

else

{

Toast.makeText(getContext(),"nothing to undo", Toast.LENGTH_SHORT).show();

}

}

public void onClickRedo ()

{

if (undonePaths.size()>0)

{

paths.add(undonePaths.remove(undonePaths.size()-1)) ;

invalidate();

}

else

{

Toast.makeText(getContext(),"nothing to redo", Toast.LENGTH_SHORT).show();

}

}

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> = TOUCH_TOLERANCE || dy> = TOUCH_TOLERANCE)

{

mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);

mX = x;

mY = y;

}

}

private void touch_up()

{

mPath.lineTo(mX, mY);

mCanvas.drawPath(mPath, Constants.mPaint);//commit the path to our offscreen

paths.add(mPath);

Toast.makeText(getContext(),"path added" + paths.size(), Toast.LENGTH_SHORT).show();

mPath.reset();//kill this so we don't double draw

Constants.mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));

//mPaint.setMaskFilter(null);

}

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

}

}

问题:

在每个 touch_up 上,我添加了一个toast计算 arraylist paths 中路径的数量,并正确显示。 但是,在单击 btn_undo 后撤销功能不起作用。

那怎么可能是固定的? 非常感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值