NineOldAnimations 设计解析

NineOldAnimations 设计解析1. 功能介绍

NineOldAndroids是一款支持在低版本( api 11以下 )使用Android属性动画以及3D旋转动画的框架,它提供了一系列如ViewAnimator,ObjectAnimator,ViewPropertyAnimator等API来完成这些动画,解决了Android动画框架在低版本的兼容性问题。在api 11 ( Honeycomb (Android 3.0) )后Android推出了属性动画、X轴翻转等动画效果,但是这些效果却不能运行在api 11以下,NineOldAndroids的出现使得这些动画效果能够兼容低版本系统,,保证动画在各个系统版本能够完美运行。

2. 总体设计

以上是NineoldAnimations的整体设计图,Animator通过PropertyValuesHolder来更新对象的目标属性。如果用户没有设置目标属性的Property对象,那么会通过反射的形式调用目标属性的setter方法来更新属性值;否则则通过Property的set方法来设置属性值。这个属性值则通过KeyFrameSet的计算得到,而KeyFrameSet又是通过时间插值器和类型估值器来计算。在动画执行过程中不断地计算当前时刻目标属性的值,然后更新属性值来达到动画效果。 这篇文章更多的是从整体结构方面介绍NineOldAnimations,如果需要从源码上剖析请参考NineOldAnimations源码分析.

2.1 类详细介绍

在进行下一步的分析之前,我们先来了解一下NineOldAndroids中一些核心的类以及它们的作用。 * ValueAnimator : 该类是Animator的子类,实现了动画的整个处理逻辑,也是NineOldAndroids最为核心的类; * ObjectAnimator : 对象属性动画的操作类,继承自ValueAnimator,通过该类使用动画的形式操作对象的属性; * TimeInterpolator : 时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearInterpolator(线性插值器:匀速动画)、AccelerateDecelerateInterpolator(加速减速插值器:动画两头慢中间快)和DecelerateInterpolator(减速插值器:动画越来越慢)等; * TypeEvaluator : TypeEvaluator的中文翻译为类型估值算法,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator(针对整型属性)、FloatEvaluator(针对浮点型属性)和ArgbEvaluator(针对Color属性); * Property : 属性对象,主要是定义了属性的set和get方法; * PropertyValuesHolder : PropertyValuesHolder是持有目标属性Property、setter和getter方法、以及关键帧集合的类。 * KeyframeSet : 存储一个动画的关键帧集合; * AnimationProxy : 在API 11以下使用View的属性动画的辅助类。

2.2 基本使用

示例1: 改变一个对象(myObject)的 translationY属性,让其沿着Y轴向上平移一段距离:它的高度,该动画在默认时间内完成,动画的完成时间是可以定义的,想要更灵活的效果我们还可以定义插值器和估值算法,但是一般来说我们不需要自定义,系统已经预置了一些,能够满足常用的动画。

ObjectAnimator.ofFloat(myObject, “translationY”, -myObject.getHeight()).start();

示例2: 改变一个对象的背景色属性,典型的情形是改变View的背景色,下面的动画可以让背景色在3秒内实现从0xFFFF8080到0xFF8080FF的渐变,并且动画会无限循环而且会有反转的效果。

ValueAnimator colorAnim = ObjectAnimator); colorAnim.setDuration(3000); colorAnim.setEvaluator(new ArgbEvaluator()); colorAnim.setRepeatCount(ValueAnimator.INFINITE); colorAnim.setRepeatMode(ValueAnimator.REVERSE); colorAnim.start();

示例3: 动画集合,5秒内对View的旋转、平移、缩放和透明度都进行了改变 。

AnimatorSet (ObjectAnimator.ofFloat(myView, “rotationX”, 0, 360),ObjectAnimator.ofFloat(myView, “rotationY”, 0, 180),ObjectAnimator.ofFloat(myView, “rotation”, 0, -90),ObjectAnimator.ofFloat(myView, “translationX”, 0, 90),ObjectAnimator.ofFloat(myView, “translationY”, 0, 90),ObjectAnimator.ofFloat(myView, “scaleX”, 1, 1.5f),ObjectAnimator.ofFloat(myView, “scaleY”, 1, 0.5f),ObjectAnimator.ofFloat(myView, “alpha”, 1, 0.25f, 1) )(5 * 1000).start();

示例4: 下面是个简单的调用方式,其animate方法是nineoldandroids特有的,动画持续时间为2秒,在Y轴上旋转720度,并且平移到(100, 100)的位置。

Button myButton = (Button)findViewById(R.id.myButton); animate(myButton).setDuration(2000).rotationYBy(720).x(100).y(100);

由于时间关系,上述示例代码引用自任玉刚的博客,本人也整理了一份简单的demo,猛击 Demo地址进入。

3. 流程图3.1 ValueAnimator流程图

3.2 View的ObjectAnimator流程图

4. 详细设计

4.1 核心原理分析4.1.1 ValueAnimator.java人情似纸张张薄,世事如棋局局新。

NineOldAnimations 设计解析

相关文章:

你感兴趣的文章:

标签云: