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

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

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

}

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

  1. PCB抄板过程中反推原理图的方法

    PCB抄板过程中反推原理图的方法 在PCB设计行业中,有PCB文件想要原理图该怎么办呢?在PCB反向技术研究中,反推原理图是指依据PCB文件图反推出或者直接根据产品实物描绘出PCB电路图,旨在说明线路 ...

  2. 十大面试问题解惑,秒杀一切HR、技术面试。程序员必读! 最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余。小编收集了10个面试官最爱提的问题

    十大面试问题解惑,秒杀一切HR.技术面试.程序员必读! 最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余.小编收集了10个面试官最爱提的问题 ...

  3. 【操作系统】进程的创建与终止过程中的父子进程

    进程在执行过程中,能通过系统调用创建多个新进程. 创建进程称为父进程,而新进程称为该进程的子进程.每一个新进程可以再创建其他进程,从而形成了进程树. 通常,进程需要一定的资源(如CPU时间.内存.文件 ...

  4. linux时间界面返回,Android开发教程:游戏过程中按Home键后返回游戏界面

    症状:游戏过程中,按下Home键返回手机主菜单,再点击游戏图标试图返回游戏的时候屏幕黑的一片! 以前一直没在意只有结束线程在运行游戏,今天觉得改仔细琢磨一下这个问题了! 首先第一件事:打印Logo看看 ...

  5. 高通android 7.0彩信发送过程中使用到的google pdu

    对于彩信与数据库的交互操作,google并没有将这部分代码放在Mms中,而是放在framework中的pdu部分. 具体代码路径是在:opt\telephony\src\java\com\google ...

  6. pdffactory 打印字体_pdfFactory使用过程中的一些小技巧

    pdfFactory是一款无须通过Acrobat来创建PDF文件的打印机驱动程序,可以将其理解为一款虚拟打印机,我们可以借助它将多种其他格式的文件转为PDF文件. 在学习.工作中有可能需要经常使用pd ...

  7. C# JSON使用过程中开发的小工具

    我在用JSON的过程中,经常要去看一下JSON的结构,而JSON串大不部分时候都是未格式化的数据,一次我不得不用一些网页上的在线解析和格式化工具来进行格式化查看,但是这些网页有时候并不好用:因此就结合 ...

  8. # Windows下关于安装Geany编辑器过程中的一点小发现(可能对初次安装的人有用)

    首先,我们在安装geany的过程中需要先搜索进入geany的官网 http://geany.org/ 进入之后我们需要找到我们需要的版本(此处默认以最新版为例) 先从菜单栏处的Download进入Re ...

  9. Maven3.2创建webapp项目过程中问题以及解决方案

    用maven组件来创建web项目,maven的好处一大堆,但是在创建项目的时候问题也很多,诸多不顺,网上找了很多资料,貌似都没能解决问题. 环境:jdk1.7.0_80,eclipse4.4,mave ...

  10. vs2013在使用ef6时,创建模型向导过程中,四种模型方式缺少2种

    下载eftool,并安装 https://download.microsoft.com/download/2/C/F/2CF7AFAB-4068-4DAB-88C6-CEFD770FAECD/EFTo ...

最新文章

  1. 平板python_Wacom平板电脑的Python示例
  2. hdu4885 有 限制的最短路
  3. js的数据类型--数字
  4. linux升级Python2.7.12
  5. 联合国和平音乐会主题粮安天下 国际农民丰收节贸易会贺电
  6. docker容器的构建
  7. openacc的Linux安装教程,科学网—opensuse 13.1 系统 openACC编译器使用及GPU并行编程环境配置 - 马小军的博文...
  8. C++STL的 list容器
  9. 2014年工作中遇到的20个问题:120-140
  10. P4395-[BOI2003]Gem气垫车【树形dp,四色定理】
  11. 《Linux编程》作业 ·003【文件I/O操作】
  12. ubuntu文件编码转换
  13. SAP License:财务流程-新
  14. 我的世界java怎么自制皮肤_我的世界皮肤制作教程
  15. java实现电子面单pdf生成_电子面单打印功能实现方法
  16. 联机饥荒一直显示启动服务器,饥荒联机版启动服务器时遇到一些麻烦 | 手游网游页游攻略大全...
  17. WPF——自定义日历
  18. 华为中国生态伙伴大会2019盛大开幕:智能进化 共赢生态未来
  19. PHP: Fatal error:Call to undefined function com_create_guid()
  20. DevExpress 皮肤控件 更换皮肤

热门文章

  1. 学术英语阅读与写作6:讨论和结论discussion and conclusion
  2. 电脑连接HDMI显示器后没声音
  3. 如何在html中引入代码,如何在HTML页面引入javaScript代码
  4. [转]色度抽样(4:2:0)到底是什么意思?
  5. php和mysql web开发 目录_PHP和MySQL Web开发(原书第5版)简介,目录书摘
  6. 无线网dns服务器设置错误,DNS错误怎么办(如何正确设置DNS)
  7. html5 vr 制作软件,Object2VR中文免费版
  8. java 阳历日期时间获取年月日时干支
  9. 奥克兰计算机科学专业世界排名,2021年度QS世界大学学科排名发布!奥克兰理工大学特色专业盘点...
  10. 可编程控制器PLC概述