Android Tint着色与帧动画结合
- 需求
最近遇到一个需求:


要求根据后台接口给的色值 显示不同色值的帧动画(UI给了三张透明色的图)
正常的帧动画 是配置在xml里三张静态图片 然后加载一下就完事了
现有的静态图片是透明的 还没有填充颜色
- Tint着色
val drawableVoice = DrawableCompat.wrap(ContextCompat.getDrawable(mContext, R.drawable.default_ic_play3)!!)
DrawableCompat.setTint(drawableVoice !!, Color.parseColor(mData!![positon].voiceRgb))
1.由于是一个由三张图片组成的序列帧, 那么需要分别对三张资源目录下的图片进行着色.
2.着色后得到的是3个Drawable对象 , 那么剩下的事情就是要把它们关联起来,形成一个帧动画展示出来就行了
- 帧动画
通常帧动画的实现步骤是这样的 :
利用xml文件的形式实现:
(1)找一些图片放到drawable文件夹下
(2)在drawable文件夹下通过xml文件生成动画 创建的就是一个animation_list的一个xml文件
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >//设置是否循环播放,默认的是循环播放,false为只播放一次
<item
android:drawable="@drawable/img1"
android:duration="50"/>
<item
android:drawable="@drawable/img2"
android:duration="50"/>
<item
android:drawable="@drawable/img3"
android:duration="50"/>
</animation-list>
(3)找到咱们写的那个动画xml
(4)通过imageView设置一个背景图
(5)通过动画对象的start(),stop()方法来开启或者是停止动画。
示例代码如下:
iv_frame = (ImageView) findViewById(R.id.iv_frame);
// 通过逐帧动画的资源文件获得AnimationDrawable示例
frameAnim=(AnimationDrawable) getResources().getDrawable(R.drawable.bullet_anim);
// 把AnimationDrawable设置为ImageView的背景
iv_frame.setBackgroundDrawable(frameAnim);
//开启动画
//frameAnim.start()
//停止动画
//frameAnim.stop()
很明显 , 这种方式无法与代码中的Drawable对象关联起来 , 那么下面这种方式可以很好的帮到我们 :
利用代码的形式实现:
(1)创建图片动画的对象
(2)一帧一帧的添加图片,并且设置了显示时间
(3)设置是否为循环播放 默认的就是只播放一次
(4)开启动画,或者停止动画
示例代码如下:
frameAnim1 = AnimationDrawable()
//声音图标着色
val drawableVoice11 = DrawableCompat.wrap(ContextCompat.getDrawable(container.context, R.drawable.default_ic_play1)!!)
DrawableCompat.setTint(drawableVoice11, Color.parseColor(themeData!![positon].voices[0].voiceRgb)) val drawableVoice12 = DrawableCompat.wrap(ContextCompat.getDrawable(container.context, R.drawable.default_ic_play2)!!)
DrawableCompat.setTint(drawableVoice12, Color.parseColor(themeData!![positon].voices[0].voiceRgb)) val drawableVoice13 = DrawableCompat.wrap(ContextCompat.getDrawable(container.context, R.drawable.default_ic_play3)!!)
DrawableCompat.setTint(drawableVoice13!!, Color.parseColor(themeData!![positon].voices[0].voiceRgb))
frameAnim1?.addFrame(drawableVoice11, 200)
frameAnim1?.addFrame(drawableVoice12, 200)
frameAnim1?.addFrame(drawableVoice13, 200)
//设置循环播放(默认只播放一次)
frameAnim1?.isOneShot = false
voice1.setImageDrawable(frameAnim1)
//开启动画
//frameAnim1?.start() //停止动画
//frameAnim1?.stop()
帧动画相关
有时候,我们需要帧动画停止时正好处在指定的那一帧 , 下面给出一种有效的方法:
if (frameAnim1 != null && frameAnim1!!.isRunning) {
frameAnim1!!.selectDrawable(2)
frameAnim1!!.stop()
}
AnimationDrawable#selectDrawable(int index)方法可以指定选中index处的帧图 , 然后调用stop方法就可以停留在此帧处, 并结束动画
- 小结
适当地使用Tint,可以有效的减少图片资源在apk体积的占用 , 并且给UI设计师节约了一些时间 , 最关键的还是当后台数据支持自动配置或者是数据量更改时 , 客户端依然能够支持自动着色填充并显示 , 无需修改客户端的代码.
Android Tint着色与帧动画结合的更多相关文章
- Android(java)学习笔记198:Android下的逐帧动画(Drawable Animation)
1.帧动画: 帧动画顾名思义,一帧一帧播放的动画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一帧 ...
- Android(java)学习笔记141:Android下的逐帧动画(Drawable Animation)
1. 帧动画: 帧动画顾名思义,一帧一帧播放的动画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一 ...
- Android游戏开发研究帧动画实现
1.动画的原则框架 帧的动画帧的动画顾名思义,画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在同样区域高速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,事实上只 ...
- Android 学习之逐帧动画(Frame)
帧动画就是将一些列图片.依次播放. 利用肉眼的"视觉暂留"的原理,给用户的感觉是动画的错觉,逐帧动画的原理和早期的电影原理是一样的. a:须要定义逐帧动画,能够通过代码定义.也能够 ...
- android中的逐帧动画
在android中实现动画最简单的一种方式就是使用逐帧动画(AnimationDrawable).逐帧动画的原理同最古老的动画机制是一样的,通过快速的播放一组变化微小的图片,在人眼的视差时间下,达到一 ...
- android图片闪烁或帧动画
remote_recording_transition.xml 文件 <?xml version="1.0" encoding="utf-8"?> ...
- Android动画效果之Frame Animation(逐帧动画)
前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame ...
- Android Animation 动画Demo(Frame帧动画)
上一页介绍Animation动画第一:Tween吐温动画. 本文介绍了以下Animation也有动画的形式:Frame帧动画. Frame动画是一系列照片示出的顺序按照一定的处理,和机制,以放电影很阶 ...
- Android简单逐帧动画Frame的实现(三)
android之动画(三)通过AnimationDrawable控制逐帧动画 android与逐帧动画: 效果图: 当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的状态. ...
随机推荐
- 洛谷P2587 [ZJOI2008] 泡泡堂
题目传送门 分析:一道策略游戏题,要求最大期望得分和最小期望得分.首先分析最大,很显然是可以用一种类似于田忌赛马的思维来做,将两队的实力按照从大到小(其实从小到大也可以)排序,然后就按照顺序比较,可能 ...
- 使用0填充string(构造类似‘00001’的字符串)
今天在对视频进行爬取的时候,发现url最后是000001,然后是000002,依次增加,而且每一个url请求只能得到一个分段了的视频,这种情况下构造url就成了一个问题. python有一个函数可以处 ...
- 在spring中手动编写事务
利用事务模板TransactionTemplate来手动添加事务 public void addRant(Rant rant) { transactionTemplate.execute(-?tran ...
- JZYZOJ1379天才的约数和 数论 约数和
http://172.20.6.3/Problem_Show.asp?id=1379 易得n=a*b2/b1: 需要注意算出n之后要判断n的约数和是否等于a,这里需要用约数和定理递归,递归前求一下 ...
- 【最小乘积生成树】bzoj2395[Balkan 2011]Timeismoney
设每个点有x,y两个权值,求一棵生成树,使得sigma(x[i])*sigma(y[i])最小. 设每棵生成树为坐标系上的一个点,sigma(x[i])为横坐标,sigma(y[i])为纵坐标.则问题 ...
- JS解决URL传递参数中文乱码问题
function getUrlParam(name){ // 用该属性获取页面 URL 地址从问号 (?) 开始的 URL(查询部分) var url = window.location.search ...
- [转]详解spring 每个jar的作用
spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2. ...
- 神技!微信小程序(应用号)抢先入门体验(附最新案例-豆瓣电影)持续更新
微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...
- 多线程--Task,等待用户输入AutoResetEvent
上一篇文章:.NET:如何让线程支持超时?已经说明目前微软主推的多线程方案是task: 注意:Task最好引用.NET4.5. 4.0也行,但不成熟.Thread引用2.0就够了. 1.通过构造函数创 ...
- 解决Hue/hiveserver2报错:java.io.IOException: Job status not available
sql是:select count(distinct col) from db.table; 排查过程中遇到过几个不同的报错: 1. beeline -u jdbc:hive2://0.0.0.0:1 ...