Android 动画之属性动画(一)#
说到动画,先给大家一点概念。众所周知,动画其实是很多帧的图片以小于人类眼睛所能识别最小的时间间隔进行播放,而Android里面的动画的原理就是通过一个 类 来管理一个 值 ,通过这个类,可以持续地改变这个值,画面本身与这个 值 相关,于是就相当于产生一帧一帧的画面,从而形成动画。
什么是属性动画(Property Animation),先来看看官方的解释
The property animation system is a robust framework that allows you to animate almost anything. You can define an animation to change any object property over time, regardless of whether it draws to the screen or not. A property animation changes a property's (a field in an object) value over a specified length of time.
它是为了弥补补间动画(Tween Animation)的缺陷所引入的,比起补间动画的优势有
- 补间动画只能对view对象进行操作,但是属性动画可以对任何Object的任何属性进行操作,不管是看见还可是不可见
- 补间动画只提供了移动,缩放,旋转,淡入淡出这几种动画,而补间动画则可以实现上述动画之外的更多效果
- 补间动画还有一个致命缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性。什么意思呢?比如说,现在屏幕的左上角有一个按钮,然后我们通过补间动画将它移动到了屏幕的右下角,现在你可以去尝试点击一下这个按钮,点击事件是绝对不会触发的,因为实际上这个按钮还是停留在屏幕的左上角,只不过补间动画将这个按钮绘制到了屏幕的右下角而已,而属性动画则是完全改变了view的属性
- 但是,补间动画 的建立时间会比 属性动画 动画要短,代码量也会更少,当补间动画可以满足所需要的动画效果时,首先使用补间动画!
The characteristics of an porperty animation##
在属性动画里面,有如下特性:
- Duration(动画运行持续时间):默认300ms
- Time interpolation(时间内插值):简单来说,想象一个值从0变到1,中间产生50个值,Time interpolation 就决定了产生的值是均匀的(0,0.2,0.4,0.6,..1)还是加速的(0,0.1,0.3,0.6,1)或者减速,或者抛物线等等
- Repeat count and behavior(重复时间和行为):决定动画的效果重复几次以及是否进行逆过程,就是play back in reverse
- Animator sets(动画集):你可以把几个动画效果存放到一个集合中,进行顺序序播放或者延时等等
- Frame refresh delay(帧更新频率):决定动画帧更新的频率,通常是10ms,具体取决于系统的运行情况以及系统所提供的计时器
How Property Animation Works##
记住以上的几个特性后,接下来看看属性动画是怎样实现的:
下面是两个简单的例子,对于一个假想的Object对它的 x(位移)的属性进行动画
figure 1.Example of a linear animation
figure 2.Example of a non-linear animation
上述两个例子的动画效果是随着时间的变化,x的值发生变化,并且每10ms更新一次 x 值,从而实现了,但是也可以看到两个例子的区别是 例1 是匀速地进行位移,而 例2 则是变速的进行位移。也就是两者的Time interpolation 是不一样的。
创建一个动画需要创建一个ValueAnimator对象(当然接下来你会知道还有其他的)来对被动画的对象进行管理。它记录着动画的进程以及进行动画的属性的当前值。一个 ValueAnimator 封装(encapsulate)如下几个对象:
- elapsed fraction :这是一个用于记录动画进程的参数,值的变化范围从0~1,0代表动画进行到0%,1代表动画进行到100%,它的变化情况取决于 Duration 以及动画进行了多久
- TimeInterpolator:这是一个内插值管理器,利用 interpolated fraction 这个参数来管理 Time interpolation , 例1 中的 TimeInterpolator 就是一个线性的 Interpolator ,它的 Interpolator fraction 就会线性均匀地变化, 例2 就是一个先加速后减速的Interpolator,它的Interpolator fraction变化情况也是先加速后减速
- TypeEvaluator:它和 TimeInterpolator 一样,也是一个数值管理器,它的参数是就是所要进行的动画的属性值,例如上面例子中的 x ,而且注意到 x 是一个整数值,所以它的 TypeEvaluator 是一个 IntEvaluator
Property Animation 的内部是怎么运行的呢,与上面提到的四个对象有着重大关联:
- 当 VulueAnimator 通过调用start()方法后,就会根据 Duration 和当前已经运行了多少时间去计算 elapsed fraction ,
- elapsed fraction 被计算出来后,就会去调用 TimeInterpolator ,然后 TimeInterpolator 就会相应地计算出interpolated fraction ,不同类型的 TimeInterpolator 就会计算出不同的值。比如 例1 中,在10ms的时候, elapsed fraction = 0.25, interpolated fraction = 0.25 而在 例2 中, elapsed fraction = 0.25, interpolated fraction = 0.15
- interpolated fraction 计算完成后,就会调用 TypeEvaluator ,根据 interpolated fraction 来计算出属性值,比如上述两个例子中 x = interpolated fraction * 40
API Overview##
(请在仔细复习一下 How Property Animation Works 这一部分)
对 Property Animation 有了一个初步了解之后,接下我们来看看属性动画的一些常用的类和方法
Animator类###
- ValueAnimator : ValueAnimator 最主要的类,它用来计算 属性动画 的属性值,它包含了计算属性值的所有核心函数,动画的信息比如是否重复,监听器信息等等。对于实现一个动画有两部分,第一部分是计算属性值,第二部分是把这些值设置到你要进行的动画的属性或者对象中。而 ValueAnimator 只负责实现第一部分,所以必须为 ValueAnimator 设置一个监听器,每当属性值有改变时,进行你需要的操作
- ObjectAnimator :ValueAnimator 的一个子类。上面说到,ValueAnimator 需要自己手动为对象设置值,而 ObjectAnimator 则可以包含这一部分,可以指定你的目标对象,在大部分情况下,我们都是使用 ObjectAnimator 来进行 属性动画
- AnimatorSet:它提供一个机制来管理多个动画,比如现在有一个位移动画和缩放动画,它可以为把这两个动画归为一组,来管理他们的播放次序以及播发时间等等
Evaluator类###
Evaluator 告诉 Animator 如何去计算给定的属性值。它根据 Animator 给定的数据来计算得出属性值,常用的 Evaluator 有如下
- IntEvaluator: 系统默认的 Evaluator ,用于计算 Int 类型的属性值
- FloatEvaluator:系统默认的 Evaluator ,用于计算 Float 类型的属性值
- ArgbEvaluator:系统默认的的 Evaluator,用于计算color类型的属性值,并且这个color是以16进制数表示的
- TypeEvaluator:系统提供的一个 Evaluator 接口,用于实现自定义的Evaluator,
Interpolators类###
Time Interpolators 其实是一个时间的函数,根据时间,计算出 interpolated fraction ,不同的 Time Interpolators 决定了不同函数,比如说它可以是线性的,那么在动画播放的这段时间里,他是均匀变化的,它也可以是非线性的,比如说动画可以先加速后减速,下面列出一些系统默认的 Time Interpolators
- AccelerateDecelerateInterpolator :先加速后减速的 Time Interpolators
- AccelerateInterpolator :缓慢开始然后加速的 Time Interpolators
- AnticipateInterpolator :先往后在往前的 Time Interpolators
- AnticipateOvershootInterpolator :先往后再往前,超过目标值后再回来的 Time Interpolators
- BounceInterpolator :到达目标值后会反弹的 Time Interpolators
- CycleInterpolator :循坏的 Time Interpolators
- DecelerateInterpolator :减速的 Time Interpolators
- LinearInterpolator :线性的 Time Interpolators
- OvershootInterpolator :超过目标之后在回来的 Time Interpolators
- TimeInterpolator : Time Interpolators 的一个接口,继承他可以重写自定义的 Time Interpolators