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与逐帧动画: 效果图: 当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的状态. ...
随机推荐
- Codeforces 1082 A. Vasya and Book-题意 (Educational Codeforces Round 55 (Rated for Div. 2))
A. Vasya and Book time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 安装 SQL Server 2008 和管理工具 SQL Server 2008 management studio 及相关问题解决
Sql Server 2008 问题小总结 http://www.lihengyu.com/blog/4877.html 安装 SQL Server 2008 和管理工具 SQL Server 200 ...
- 【我要学python】MethodType和isinstance和Type函数
一.首先来看isinstance: a=6 isinstance(a,int) #返回Ture isinstance(a,str) #返回False isinstance (a,(str,int,li ...
- go chapter 2 - read file(yaml)
func main() { data, err := ioutil.ReadFile("D:/test/widua.go") if err != nil { fmt.Println ...
- Python开发基础-Day9-生成器、三元表达式、列表生成式、生成器表达式
生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 pri ...
- HDU5742 It's All In The Mind 数学思维题
Problem Description Professor Zhang has a number sequence a1,a2,...,an. However, the sequence is not ...
- BZOJ 3450 Tyvj1952 Easy(期望)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3450 [题目大意] 给出一个字符串,包含o,x和?,一个字符串的得分为 每段连续的o的 ...
- 【带权并查集】【离散化】vijos P1112 小胖的奇偶
每个区间拆成r和l-1两个端点,若之内有偶数个1,则这两个端点对应的前缀的奇偶性必须相同,否则必须相反. 于是可以用带权并查集维护,每个结点储存其与其父节点的奇偶性是否相同,并且在路径压缩以及Unio ...
- bzoj 1689: [Usaco2005 Open] Muddy roads 泥泞的路
1689: [Usaco2005 Open] Muddy roads 泥泞的路 Description Farmer John has a problem: the dirt road from hi ...
- 【MySQL笔记】用户管理
1.账户管理 1.1登录和退出MySQL服务器 MySQL –hhostname|hostIP –P port –u username –p[password] databaseName –e &qu ...