标签:
我前一段时间在制作涂鸦板的过程中在处理橡皮擦功能上碰上了一些小问题,网上部分资源提到的实现方法和我下面说到的橡皮擦基本方法实现思路大仿类似,以下是基本思路:橡皮擦就是用和画布颜色一致颜色的画笔在屏幕触摸,实现橡皮擦的功能。
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