Android项目刮刮奖详解(二)
Android项目刮刮奖详解(一)
前言
上期我们简单地实现了一个画板的功能,用户可以在上面乱写乱画,其实,刮刮奖也是如此,用户刮奖的时候也是乱写乱画的。
刮刮奖原理
一共有两层画布,底层画布存放中奖信息的图片,上层画布则是一个遮盖层,我们将底层画布成为信息层,上层画布称作为遮盖层。
用户再遮盖层涂画,我们将用户涂画的痕迹从遮盖层擦除,显示出信息层的内容,则就实现了一个简单的刮刮奖。
实现
基于上期的代码,我们来讲解一下。
上一期中在注释中我也有提示到哪些代码是今天的内容,我们拿来看看吧。
设置背景图
首先,我们需要设置信息层的背景图,背景图随意,记得把图片放在drawable文件夹中
//背景图BitmapDrawable bitmap = (BitmapDrawable) getResources().getDrawable(R.drawable.rewrite6);//从drawable文件夹中获得指定名称的该图片,并转型为bitmapdrawable,R.drawable.xxxbackground = bitmap.getBitmap();//bitmapdrawable通过getBItmap方法得到bitmapbackground = Bitmap.createScaledBitmap(background,width,height,true);//利用Bitmap的静态方法创建一个合适的bitmap(宽高都是之前onMeasure方法中获取的,不太清楚的同学请去上期回顾一下)
使用canvas画出背景图
补充 xfermode
Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是图像混合的一种,这个方法跟我们上面讲到的setColorFilter蛮相似的。
查看API文档发现其果然有三个子类:AvoidXfermode, PixelXorXfermode和PorterDuffXfermode,这三个子类实现的功能要比setColorFilter的三个子类复杂得多。
由于AvoidXfermode, PixelXorXfermode都已经被标注为过时了,所以这次主要研究的是仍然在使用的PorterDuffXfermode:
该类同样有且只有一个含参的构造方法PorterDuffXfermode(PorterDuff.Mode mode)
其中的mode有十八种模式,后面谷歌又添加了Add和Overlayl两种模式,下面是十六种模式的图解
我们怎么去理解这张图呢?我们只要记住一点,先画dst,再画src,有同学说不好记啊,简单,教你个口诀,先画底(dst),再画上(src)
- 第一个模式clear是清除
- 第二个src则是只显示上层图片
- 第三个dst则是只显示底层图片
- 第四个srcOver如图所示,显示出dst图片的四分之三,显示src的全部
- 其他的不多说了,
我们即将用到的是dsc_out,讲解一下
先画dst,再画src,src消失,只剩下dst,这其实就是橡皮擦的原理,我们利用这个擦除遮盖层就可以显示出信息层中的图片了
明白了原理之后,我们来看onDraw方法,在onDraw方法中,使用canvas将背景图画出,这里顺序是先画信息层,之后再到遮盖层,遮盖层将mBitmap直接画出来,回顾一下,这里是使用到了双缓冲技术,canvas直接复制了mBitmap,在View中显示出来,mBitmap其实是mCanvas在上面画出了用户手指的移动痕迹
canvas.drawBitmap(background,0,0,null);//画出信息层canvas.drawBitmap(mBitmap, 0,0, null);//画出遮盖层mOutterPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));//设置xfermode dst\_outmCanvas.drawPath(mPath, mOutterPaint);//mCanvas在mBitmap中画出用户的手指的移动痕迹
测试图片
Android项目刮刮奖详解(二)相关推荐
- Android Loader 异步加载详解二:探寻Loader内部机制
Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/7025991 ...
- Android 10.0 Activity启动详解(二)
Android 10.0 Activity启动详解(一) 我们在上一篇博客中已经介绍了关于Activity的一些基础概念.这一篇博客我们以Android 10.0的代码来分析Activity的启动流程 ...
- Android Loader 异步加载详解一:基础概念
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70241844 本文出自[赵彦军的博客] Android Loader 异步加载详解 ...
- Android openGl开发详解(二)
https://zhuanlan.zhihu.com/p/35192609 Android openGl开发详解(二)--通过SurfaceView,TextureView,GlSurfaceView ...
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...
- 全志 android 编译,全志Android SDK编译详解(二)
注意要确定安装了jdk) 第一步: cd lichee; ./build.sh -p sun5i_elite -k 3.0 (apt-get install uboot-mkimage需要安装m ...
- Android 融云IM集成以及使用详解(二)
Android 融云IM集成以及使用详解(二) 上篇讲解了集成和好友列表和消息记录的使用,这篇将讲解聊天界面和群聊界面的使用 先附上一张效果图 先介绍布局文件 <LinearLayout xml ...
- 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
最新文章
- KS009基于SSH实现宠物管理系统
- 从 Zero 到 Hero ,一文掌握 Python--转
- 【USACO 2.1】The Castle
- php怎么关闭oracle连接,PHP 连接 Oracle
- 韩春雨要“翻案”?最新研究发现NgAgo具有DNA编辑能力
- PyTorch 1.0 中文官方教程:ONNX 现场演示教程
- java spring文件下载_SpringMVC实现文件上传和下载的工具类
- 基于发起源判断CSRF***的方法
- K-special Tables
- ReentrantLock深入学习
- CSDN客服联系方式
- 水果忍者 java_水果忍者v1.7.2
- 读计算机网络得学五笔吗,打破无聊难学 另类五笔学习方法
- jsDoc的使用文档
- 关于自己看百度修改c盘下的用户名,更改了注册表里的profilelist文件,重启后恢复原始桌面并提示注销问题与解决方案。
- 《逆袭大学——传给IT学子正能量》一审稿目录
- 这几个免费PPT模板、素材库,你绝对不能错过
- 百度云盘秒传链接的建立
- 如何在pdf中加入手写签名
- Tian Ji -- The Horse Racing(田忌赛马)/贪心算法