Android项目刮刮奖详解扩展篇——开源刮刮奖View的制作
前言
我们已经成功实现了刮刮奖的功能了,本期是扩展篇,我们把这个View直接定义成开源控件,发布到JitPack上,以后有需要也可以直接使用,关于自定义控件的知识,不了解的同学可以看这下面我之前写的这两篇
实现
定义属性
- text 文字内容
- textColor 文字颜色
- textSize 文字大小
- paintSize 擦除效果的宽度
- messageBackground 中奖图片
- cover 遮盖层图片或遮盖层颜色
- isDrawText 显示文字或者是图片,默认显示文字
- clearFlag 达到多少阈值清除遮盖层,默认60
按照之前那一篇自定义控件来操作,我们建立个atts.xml,在其中定义属性,这里,我们可以将中奖图片和信息层颜色合为一项,遮盖层图片和遮盖层颜色合为一项
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="GuaJiangView">
<attr name="text" format="string"/>
<attr name="textColor" format="color"/>
<attr name="textSize" format="integer"/>
<attr name="messageBackground" format="color|reference"/>
<attr name="cover" format="color|reference"/>
<attr name="PaintSize" format="integer"/>
<attr name="isDrawText" format="boolean"/>
<attr name="clearFlag" format="integer"/>
</declare-styleable>
</resources>
获得我们定义的属性
TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.GuaJiangView);
text = ta.getString(R.styleable.GuaJiangView_text);
textColor = ta.getColor(R.styleable.GuaJiangView_textColor,0);
textSize = ta.getInteger(R.styleable.GuaJiangView_textSize,16);
coverDrawable = ta.getDrawable(R.styleable.GuaJiangView_cover);
isDrawText = ta.getBoolean(R.styleable.GuaJiangView_isDrawText,true);
clearFlag = ta.getInteger(R.styleable.GuaJiangView_clearFlag,60);
if (!isDrawText){
backgroundDrawable = ta.getDrawable(R.styleable.GuaJiangView_messageBackground);
}
paintSize = ta.getInteger(R.styleable.GuaJiangView_PaintSize,10);
ta.recycle();
这里加了个判断,当用户选择只写中奖信息,我们可以屏蔽掉获取信息层的图片设置,防止出错
修改之前的项目代码
开源库,自然是不能像之前项目那般写的那么凌乱,自然是得写上厚厚的注释,将代码重构优化一下,还得考虑到相关的逻辑
这里提一下,attrs中可以使用
\|来使该属性接收两个属性,最常用的还是背景颜色和背景图片合成一项,例如上面定义的attr中的背景<attr name="messageBackground" format="color|reference"/>
我们可以通过下面的方法来对这样的属性使用,获得之后转换为bitmap
/**
* drawable转换为bitmap
* @param drawable 需要转换的drawble
* @param width 宽
* @param height 高
* @return 返回bitmap
*/
public Bitmap drawableToBitmap(Drawable drawable, int width, int height) { if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
其实drawable 它本身有一个 draw方法, 只要我们调用
setBounds设置范围, 在调用draw方法就可以直接画了,上面的drawable其实已经包含有颜色了,所以我们直接调用draw方法即可在画出一个纯颜色的bitmap简单地观察,这里与会之前的mCanvas是一样的。
以新建的bitmap作为画板,之后drawable在canvas上作画(实际上是画在了bitmap),之后我们返回这个bitmap使用即可
其他地与之前差不多,大家自己琢磨琢磨吧,最后我会发出完整代码的
上传github以及JitPack
这里将不多说什么了,我这两篇写的很清楚了
简单的测试使用
GuaJiangViewDemo
我们按照文档上的方法,导入依赖,使用即可

番外——做个美女脱衣
本来想单独出来写一篇的,不过,发现也没有什么新的代码要写,我们直接拿开源库来用即可(需要美女穿衣和脱衣的衣服哦~)
我就准备了二次元少女的衣服,将两张图片放到drawable文件夹之中,我们就可以开始工作了

弄好之后,我的android Studio竟然卡死了?!
什么鬼!!好在重启一下软件就好了
激动时刻————

哈哈,成功,刮刮卡项目的详解就到此结束啦~
Android项目刮刮奖详解扩展篇——开源刮刮奖View的制作的更多相关文章
- Android项目刮刮奖详解(二)
Android项目刮刮奖详解(一) 前言 上期我们简单地实现了一个画板的功能,用户可以在上面乱写乱画,其实,刮刮奖也是如此,用户刮奖的时候也是乱写乱画的. 刮刮奖原理 一共有两层画布,底层画布存放中奖 ...
- Android项目刮刮奖详解(三)
Android项目刮刮奖详解(二) 前言 上一期我们已经实现了一个简易的刮刮卡功能,这一期我们来将其完善一下 目标 将刮刮奖的宽高改为合适高度 将刮刮奖位置居中 将信息层的图片换成文字(重点) 实现 ...
- Android项目刮刮奖详解(四)
Android项目刮刮奖详解(三) 前言 上一期我们已经是完成了刮刮卡的基本功能,本期就是给我们的项目增加个功能以及美化一番 目标 增加功能 用户刮卡刮到一定程度的时候,清除遮盖层 在遮盖层放张图片, ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Android 之窗口小部件详解(三) 部分转载
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
- Android Gradle manifestPlaceholders 占位符详解
Android Gradle manifestPlaceholders 占位符详解 在实际项目中,AndroidManifest里十几个地方的值是需要动态的改变(生成apk文件的时候).如果每次去改也 ...
- Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送
Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...
随机推荐
- SSIS - 3.变量
跟其他变成语言一样,SSIS包中的变量是用来存储临时值的,变量使得整个SSIS包使用起来更加灵活.比如,我们可以遍历一个文件夹来获取文件夹下的所有文件的名称并把名称存储到一个变量中以便进一步处理.在S ...
- FCC(ES6写法) Symmetric Difference
创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(symmetric difference) (△ or ⊕)数组. 给出两个集合 (如集合 A = {1, 2, 3} 和集合 B = {2 ...
- 1.4 The usage of plug-in
Once upon a time, we once thought naively that Android plug-in was intended to add new features or a ...
- 【RL-TCPnet网络教程】第3章 初学RL-TCPnet的准备工作及其快速上手
第3章 初学RL-TCPnet的准备工作及其快速上手 俗话说万事开头难,学习一门新的知识,难的往往不是知识本身,而是如何快速上手,需要什么资料和开发环境.一旦上手后,深入的学习就相对容易些 ...
- Redis线程模型
Redis 基于 Reactor 模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler): 文件事件处理器使用 I/O 多路复用(multiplexi ...
- Java两种方法实现循环报数
问题描述: 十个猴子围成一圈选大王,依次1-3 循环报数,报到3 的猴子被淘汰,直到最后一只猴子成为大王.问,哪只猴子最后能成为大王? 方法一:Java链表 public class TestAll ...
- [Swift]LeetCode79. 单词搜索 | Word Search
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
- MyBatis增、删、改、查
1.config.xml文件的基本配置信息 2.选择数据源 3.mybatis约定 (1)parameterType和resultType 只能传一个参数,但是我们可以传一个数组或者集合,达到传多个参 ...
- 《关于长沙.NET技术社区未来发展规划》问卷调查结果公布
那些开发者们对于社区的美好期待 2月,长沙.net 技术社区自从把群拉起来开始,做了一次比较正式.题目为<关于长沙.NET技术社区未来发展规划>的问卷调查,在问卷调查中,溪源写道: 随着互 ...
- React 中 Link 和 NavLink 组件 activeClassName、activeStyle 属性不生效的问题
首先 导航链接应该使用 NavLink 而不再是 Link NavLink 使用方法见 https://github.com/ReactTraining/react-router/blob/mas ...