Android Animations
-
MyObjectAnimator
- 负责动画的创建、启动、执行,真正处理都是交给MyFloatPropertyValuesHolder;
- 设置动画的时长
- 设置动画的插值器
-
MyFloatPropertyValuesHolder
- 动画真正的处理类。
- 将动画随时间变化的一组值(values)交给 MyKeyframeSet 转换为关键帧保存起来。
- 修改 View 的属性,完成动画。
-
MyKeyframeSet 关键帧集合。
- 计算每个关键帧的位置百分比。
- 估值器,计算下一帧的值。
-
MyFloatKeyframe 关键帧,变量保存着某一时刻的具体状态。
- mFraction:当前进度的百分比。
- mValue:当前值。
例如设置
float... values
为1f, 1.5f, 2f, 3f
,那么 mValue 分别为1f, 1.5f, 2f, 3f
,mFraction 分别为0、0.25、0.5、1
。 -
VSYNCManager VSync 信号,屏幕刷新频率是 60Hz,也就是每秒刷新 60次(每秒 60帧),也就是每隔 16ms 刷新一次。引入VSync 信号,相比每个动画设置定时器有三个优点:
- 由系统统一触发完成绘制。
- 每个动画绘制完成是公平的,不会因为当前帧没有完成绘制,出现阻塞的现象。举个例子,某个绘制花费时间是 24ms,在16ms时得到 VSync 信号后,无法进行正常渲染,这样就发生了丢帧现象。那么用户在 32ms内看到的会是同一帧画面。
- 节省资源,由系统提供一个,如果每个动画都有自己的定时器,非常耗性能。
由于第三方应用是不能监听 VSync 信号,这里通过线程睡眠 16ms 模拟 VSync 信号。
-
LinearInterpolator 线性插值器,通过传入百分比,返回新的百分比,达到加速、减速的效果。
-
FloatEvaluator 估值器,计算下一帧的值。
- 自定义容器,ParallaxContainer
- 自定义LayoutInflater,ParallaxLayoutInflater
- 原生控件添加自定义属性
- 自定义动画
参考: