一、动画基础
1、在任何系统的UI框架中,动画实现的原理都是相同的,即:在一段时间内,快速地多次改变UI外观;由于人眼会产生视觉暂留,所以最终看到的就是一个“连续”的动画,这和电影的原理是一样的;
2、将UI的一次改变称为一个动画帧,对应一次屏幕刷新,而决定动画流畅度的一个重要指标就是帧率FPS(Frame Per Second),即每秒的动画帧数;
3、很明显,帧率越高则动画就会越流畅!一般情况下,对于人眼来说,动画帧率超过16 FPS,就基本能看了,超过 32 FPS就会感觉相对平滑,而超过 32 FPS,大多数人基本上就感受不到差别了;
4、由于动画的每一帧都是要改变UI输出,所以在一个时间段内连续的改变UI输出是比较耗资源的,对设备的软硬件系统要求都较高,所以在UI系统中,动画的平均帧率是重要的性能指标,而在Flutter中,理想情况下是可以实现 60FPS 的,这和原生应用能达到的帧率是基本是持平的。
5、Animation
是一个抽象类,它本身和UI渲染没有任何关系,而它主要的功能是保存动画的插值和状态;其中一个比较常用的Animation
类是Animation<double>
。
6、Animation
对象是一个在一段时间内依次生成一个区间(Tween)之间值的类。
7、Animation
对象在整个动画执行过程中输出的值可以是线性的、曲线的、一个步进函数或者任何其他曲线函数等等,这由Curve
来决定。
8、根据Animation
对象的控制方式,动画可以正向运行(从起始状态开始,到终止状态结束),也可以反向运行,甚至可以在中间切换方向。
9、Animation
还可以生成除double
之外的其他类型值,如:Animation<Color>
或Animation<Size>
。
10、在动画的每一帧中,我们可以通过Animation
对象的value
属性获取动画的当前状态值。
2、动画通知
可以通过Animation
来监听动画每一帧以及执行状态的变化,Animation
有如下两个方法:
addListener()
;它可以用于给Animation
添加帧监听器,在每一帧都会被调用。帧监听器中最常见的行为是改变状态后调用setState()
来触发UI重建。addStatusListener()
;它可以给Animation
添加“动画状态改变”监听器;动画开始、结束、正向或反向(见AnimationStatus
定义)时会调用状态改变的监听器。