ColorTouch动画模块(下)

达芬奇密码2018-07-03 13:48

3 ColorTouch动画模块实现

3.1 动画模块的包含文件

        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:该类型下必须定义controlPoint1controlPoint2属性

customTimelineType:该类型下必须定义customTimelineFunction属性

controlPoint1controlPoint2

        3bezier曲线的中间的2个控制点

       其中第1个控制点位于{x=0,y=0},第4个控制点位于{x=1,y=1}

       该属性只有在timelineTypebezierBasedTimelineType的时候才有效

customTimelineFunction

        自定义的动画执行曲线

        该属性只有在timelineTypecustomTimelineType的时候才有效

6)动画执行期Animator

所有动画都需要被一个Animator实例加载才能执行起来

addAnimation(animation):加载一个动画,并马上执行

dispose():取消所有动画的执行

3.2 动画分配和计时器开停

        为实现统一的api接口,而不让用户关心动画是否是平台支持的,模块中会将要执行的动画进行分配,通过动画接口isNativeSupported获取当前动画是否是Native平台支持的,如果是则调用Native里的动画接口实现动画,否则使用计时器完成动画。其中,由串行和并行得到的复合动画,最终会被分解为最基本的属性动画,在该属性动画将要执行之前进行分配,判断是使用Native接口完成动画还是在ColorTouch中开启计时器完成动画。代码6中,colorAnim定义了一个按钮文本颜色动画,在iOS平台上的实际执行是通过计时器实现的。bgColorAnim定义了一个按钮背景颜色动画,在iOS平台上的实际执行是通过平台api实现的。

         为减少开销,程序中最多只会开启一个计时器,并且当在当前时间点执行的属性动画全都是在native执行的话,那就会关闭计时器。具体实现,是在每当结束一个计时器动画的时候,将当前计时器动画的数目减1,而在开始一个计时器动画的时候,将计时器的数目加1,当数目大于1的时候,开启计时器动画,当数目等于0的时候,关闭计时器。

3.3 逆动画的实现

          对于属性动画,其逆动画为fromValuetoValue反转,并对AnimationTimeline属性取逆,即将速度控制曲线(起点为(0,0),终点为(1,1))绕(0.5,0.5)旋转180度。

         对于串行动画,其逆动画为取其全部子动画的逆动画,并将子动画的顺序倒转,同样对AnimationTimeline属性取逆。

         对于并行动画,其逆动画为取其全部子动画的逆动画,并将子动画的延迟时间startOffset根据anim._startOffset = maxStartOffset - anim._startOffset + minStartOffset重新设置。同样对AnimationTimeline属性取逆。

4 总结

          ColorTouch动画模块给使用者提供了一套简单统一的接口,使用者可以方便的实现简单乃至复杂的动画及其逆动画,而无需关心当前动画或是其子动画是否是平台直接支持的,当前动画的执行是否需要开启或是关闭计时器等。

          而另一方面,动画模块仅仅提供了最为常用的功能,但在以下方面还是有待完善的地方:粒子动画、物理动画、生长动画、柔性动画。是否需要以及如何实现有待下一步的探讨了。

相关阅读:ColorTouch动画模块(上)

本文来自网易实践者社区,经作者张云龙授权发布。