橡皮擦就是用和画布颜色一致颜色的画笔在屏幕触摸,实现橡皮擦的功能。
1)初始化画笔,并且设置画笔的颜色为白色(这里其实要设置为画布的颜色)。
2)设置画笔的大小为合适的大小。
3)用一个变量记住橡皮擦的颜色,用于在其他操作后重新使用橡皮擦。
以上为简易的橡皮擦主要是使用和画布相同的的颜色来覆盖,但当背景图为一张照片(背景图)时是不可行的,因为颜色会很明显的展示在背景图上,而且需要注意的是:即使是将画笔颜色变为透明色也是不可行的,综上我们选择用渲染模式来处理橡皮擦
这里选择渲染模式Xfermode的DIS_IN,这样我们处理后会发现出现黑色阴影边框,效果实现了,但是bug非常明显
之后选择渲染模式的CLEAR这个模式会擦除所有像素点,但是发现是以黑色线条的形式去擦除的
通过STACK OVER FLOW网站超找到两者解决办法:
1.改变touch_move方法的path画图的相关方法,效果实现了但是对撤销和重做造成了一定影响(并且所画线不再圆滑),最终没有选用
privatevoid
touch_move(float x,float
y){float
dx =Math.abs(x-
mX);float
dy =Math.abs(mY-
y);if(dx>=
TOUCH_TOLERANCE|| dy>= TOUCH_TOLERANCE){// 从x1,y1到x2,y2画一条贝塞尔曲线,更平滑(直接用mPath.lineTo也可以)// mPath.quadTo(mX, mY, (x + mX)
/ 2, (y + mY) / 2); mPath.lineTo(mX,
mY);mCanvas.drawPath(mPath,
mPaint); //将一条完整的路径保存下来(相当于入栈操作)savePath.add(dp);mPath.reset(); mPath.moveTo(mX,
mY); mX=
x;mY=
y;}} privatevoid
touch_up(){ mPath=null;//
重新置空//mPath.reset();}
setLayerType(LAYER_TYPE_SOFTWARE,null);//设置默认样式,去除dis-in的黑色方框以及clear模式的黑线效果
if (currentStyle == 1) {//正常画笔mPaint.setStrokeWidth(currentSize);mPaint.setColor(currentColor);} else {//橡皮擦mPaint.setAlpha(0);mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));mPaint.setColor(Color.TRANSPARENT);mPaint.setStrokeWidth(50);}
原文:http://blog.csdn.net/zhao980919517/article/details/51352781