1)动画基类Animation
全部可执行动画(现在包括属性动画、串行动画、并行动画)的基类,拥有全部动画类的共同属性。
duration:动画从开始真正执行到结束的时间,不含动画开始时的延迟时间
timeline:动画执行的时候,进度时间曲线相关的类对象,用来控制动画的执行速率
startOffset:动画开始时,延迟的时间,不包含在duration属性里面
2)属性动画类PropertyAnimation
属性动画,是组成其他复合动画的最基本的子动画。除了基类属性外,其拥有的属性有:
target:属性动画执行的对象控件
propertyName:属性动画执行的属性名称
fromValue:动画中的变化属性的起始值
toValue:动画中的变化属性的终点值
3)串行动画类SequenceAnimation
串行动画,将其子动画串行执行的动画。除了基类属性外,其拥有的属性有:
animations:子动画的数组
4)并行动画类ParallelAnimation
并行动画,将其子动画并行执行的动画。除了基类属性外,其拥有的属性有:
animations:子动画的数组
5)动画速度控制类AnimationTimeline
其属性有:
timelineType:速度控制的类型,可赋的值为以下类型:
linearTimelineType
accelerateTimelineType
decelerateTimelineType
accelerateDecelerateTimelineType
decelerateAccelerateTimelineType
bezierBasedTimelineType:该类型下必须定义controlPoint1和controlPoint2属性
customTimelineType:该类型下必须定义customTimelineFunction属性
controlPoint1,controlPoint2:
3次bezier曲线的中间的2个控制点
其中第1个控制点位于{x=0,y=0},第4个控制点位于{x=1,y=1}
该属性只有在timelineType为bezierBasedTimelineType的时候才有效
customTimelineFunction:
自定义的动画执行曲线
该属性只有在timelineType为customTimelineType的时候才有效
6)动画执行期Animator
所有动画都需要被一个Animator实例加载才能执行起来
addAnimation(animation):加载一个动画,并马上执行
dispose():取消所有动画的执行
为实现统一的api接口,而不让用户关心动画是否是平台支持的,模块中会将要执行的动画进行分配,通过动画接口isNativeSupported获取当前动画是否是Native平台支持的,如果是则调用Native里的动画接口实现动画,否则使用计时器完成动画。其中,由串行和并行得到的复合动画,最终会被分解为最基本的属性动画,在该属性动画将要执行之前进行分配,判断是使用Native接口完成动画还是在ColorTouch中开启计时器完成动画。代码6中,colorAnim定义了一个按钮文本颜色动画,在iOS平台上的实际执行是通过计时器实现的。bgColorAnim定义了一个按钮背景颜色动画,在iOS平台上的实际执行是通过平台api实现的。
为减少开销,程序中最多只会开启一个计时器,并且当在当前时间点执行的属性动画全都是在native执行的话,那就会关闭计时器。具体实现,是在每当结束一个计时器动画的时候,将当前计时器动画的数目减1,而在开始一个计时器动画的时候,将计时器的数目加1,当数目大于1的时候,开启计时器动画,当数目等于0的时候,关闭计时器。
对于属性动画,其逆动画为fromValue和toValue反转,并对AnimationTimeline属性取逆,即将速度控制曲线(起点为(0,0),终点为(1,1))绕(0.5,0.5)旋转180度。
对于串行动画,其逆动画为取其全部子动画的逆动画,并将子动画的顺序倒转,同样对AnimationTimeline属性取逆。
对于并行动画,其逆动画为取其全部子动画的逆动画,并将子动画的延迟时间startOffset根据anim._startOffset = maxStartOffset - anim._startOffset + minStartOffset重新设置。同样对AnimationTimeline属性取逆。
ColorTouch动画模块给使用者提供了一套简单统一的接口,使用者可以方便的实现简单乃至复杂的动画及其逆动画,而无需关心当前动画或是其子动画是否是平台直接支持的,当前动画的执行是否需要开启或是关闭计时器等。
而另一方面,动画模块仅仅提供了最为常用的功能,但在以下方面还是有待完善的地方:粒子动画、物理动画、生长动画、柔性动画。是否需要以及如何实现有待下一步的探讨了。
相关阅读:ColorTouch动画模块(上)
本文来自网易实践者社区,经作者张云龙授权发布。