第7章. 动画深入分析
View动画
View动画的特殊使用场景
属性动画
注意事项
Android动画
可以分为3种
,View动画
,帧动画
和属性动画
.帧动画也属于View动画的一种,(只是表现形式上略有不同)
View动画
是一种渐进式动画
,支持自定义
,帧动画
图片过多过大易导致oom
View动画(res/anim)
- View动画分为四种,之前的总结Android动画之ViewAnimation和DrawableAnimation
- 自定义动画,继承
Animation
,并重写initialize
和applyTransformation
方法即可. - 在
applyTransformation
中需要用矩阵变换来实现动画效果. - 帧动画:顺序播放一组预先定义好的图片,对镜
AnimationDrawable
View动画的特殊使用场景
LayoutAnimation:
给ViewGroup
的子View
设置一定的出场动画,是一个View动画
.Activity/Fragment
切换效果,之前关于这方面的总结Android 布局动画之LayoutAnimation与LayoutTransition
属性动画(res/animator)
使用属性动画
属性动画之前的总结:Android动画之PropertyAnimation;Interpolator;Evaluator与Keyframe
- 对任意对象的属性进行动画,默认
300ms.
,默认刷新率为10ms/帧
. - 只要有这个属性,属性动画几乎是无所不能的.
NineOldAndroids
: 实现了API<11代理View动画
实现属性动画.- 内部使用了
差值器和估值算法.
- 建议
用代码来使用
属性动画.
差值器和估值器
TimeInterpolator
: 时间差值器,根据时间流逝百分比
计算当前属性改变百分比
TypeEvaluator
: 类型估值算法,根据当前属性改变百分比
计算改变后的值
- 系统预置三种
TypeEvaluator
:IntEvaluator
,FloatEvaluator
,ArgbEvaluator
.
监听器
AnimatorUpdateListener
,AnimatorListener
,AnimatorListenerAdapter
.
对任意属性做动画
- 必须提供
set
方法,如果动画没有传递初始值
,则需要get
方法(系统要get
取初始值) - 通过
set
改变属性后需要通过某种方法
(如改变ui)反应出来.
如果有权限,加上
get/set
方法
包装原始对象,间接提供get/set
方法/
采用ValueAnimator
,自己实现属性改变
属性动画工作原理
- 从
ValueAnimator#start
看,属性动画必须运行在Looper
线程.最终会调用AnimationHandler.start()
,这个AnimationHandler
是一个Runnable
对象.
ValueAnimator#doAnimationFrame -> animationFrame -> animateValue
-> calculateValue
setupValue(target,keyframe) -> 没有设定初始值 -> 调用get方法
-> 通过反射调用set方法
注意事项
oom
问题,主要是帧动画- 内存泄漏,
属性动画中的循环动画
需要在activity结束时停止
,View动画没有此问题. - 兼容性,
3.0
开始提供属性动画
view
动画操作的是View影像
,view.clearAnimation
清除动画- 尽量使用
dp
,不要使用px
- 开启
硬件加速
提高动画的流畅性