Android关于创建涂鸦板过程中出现的小问题

      我前一段时间在制作涂鸦板的过程中在处理橡皮擦功能上碰上了一些小问题,网上部分资源提到的实现方法和我下面说到的橡皮擦基本方法实现思路大仿类似,以下是基本思路:

     橡皮擦就是用和画布颜色一致颜色的画笔在屏幕触摸,实现橡皮擦的功能。

         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();
}
2.最终发现只需要设置默认type就能解决该问题
     
     
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);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值