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与逐帧动画: 效果图: 当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的状态. ...
随机推荐
- Java实现蛇形矩阵
public class Solution { //下x++ 左y-- 上x-- 右y++ public void prints(int n) { int[][] mp = new int[n][n] ...
- STM32通用定时器实现LED灯闪烁
刚才看了一下STM32通用定时器的教程,其实和51的定时器使用差不多.只是因为32的时钟更复杂,可操控的寄存器更多,所以写的时候可能更复杂. 使用通用定时器中断的一般步骤:1.使能定时器时钟 这个需要 ...
- 关于 Unity WebGL 的探索(一)
到今天为止,项目已经上线一个多月了,目前稳定运行,各种 bug 也是有的.至少得到了苹果的两次推荐和 TapTap 一次首页推荐,也算是结项后第一时间对我们项目的一个肯定. 出于各种各样的可描述和不可 ...
- AspNet5 Changes to [Activate] in beta-5
最近在看AspNet Core相关的文章,其中有个TagHelper,看上善若水的博客“关于TagHelper的那些事”,其中有一句 下面来自上善若水的博客原文: 我们知道ASP.NET 5实现了依赖 ...
- 关于lower_bound的优先级重载
今天才知道$lower\_bound$最后有一个优先级参数…… 首先$lower\_bound$中的优先级和序列优先级必须相同才有效 $lower\_bound$中优先级默认的是小于号,也就是说仅当序 ...
- [P1640][SCOI2010]连续攻击游戏
Link: P1640 传送门 Solution: 可以发现这道题其实是属性值集合和装备集合的对应,且每个点只能用一次 那么就能想到二分图最大匹配,一旦不可行直接退出就行了 Tip: 1.$Hungr ...
- [CODE FESTIVAL 2017]Full Tournament
题意:$2^n$个编号为$1\cdots2^n$的人打比赛,这个比赛会给每个人一个唯一的排名,比赛规则递归地定义如下: $2^n$个人打的是级别为$n$的比赛,初始时他们按某种顺序站成一排 当$n=0 ...
- 【优先队列+贪心】POJ2431-Expedition
解题方法详见<挑战程序设计竞赛(第二版)>P74-75.注意首先要对加油站以位置为关键字快排,不要遗忘把终点视作一个加油量为0的加油站,否则最终只能到达终点前的加油站. /*优先队列*/ ...
- Java学习笔记(8)
static修饰方法(静态的成员方法): 访问方式: 可以使用对象进行访问 对象.静态函数名(): 可以使用类名进行访问 类名. ...
- js禁止复制粘贴
1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键,其实是禁止快捷菜单,因为不光右键可以弹出这个菜单,键盘上空格 ...