Android动画框架(二)----属性动画

转载请注明出处:http://blog.csdn.net/fishle123/article/details/50705928

Android提供三种形式动画:视图动画,帧动画,属性动画。其中属性动画的功能最强大,在Android 3.0中开始引入。本文介绍属性动画。属性动画可以针对Object的任何一个属性实施动画,并且Object的属性值会随着动画改变,这一点与视图动画不同。属性动画功能非常强大,几乎可以实现任何动画效果。本文首先介绍属性动画的工作原理,然后全面的介绍了属性动画的使用技巧,为了更好的使用属性动画,还详细的介绍了TimeInterpolator和TypeEvaluatory,以及KeyFrame的使用,最后总结了多种同时对多个属性作用动画的方法。

属性动画工作原理

介绍属性动画的工作原理之前,先看两个例子。下图展示了一个属性动画,它针对Object的横坐标x做动画,动画时间是40ms,横坐标xx=0增加到x=40。从图中可以看出,每个10msAndroid默认的动画更新频率)Object向右水平移动10pixel。在40ms的时候,Object停止在x=40的位置。这个例子中描述的是一个使用线性差值器的例子,Object以一个平均速度移动。

 

当然,通过使用不同的差值器,可以让Object以非线性的速度移动。下图展示的这个动画,Object仍然是在40ms内移动40pixel。但是在开始的时候移动速度不断加快,快结束的时候移动速度逐渐变小。从图中可以看出,Object在中间时刻移动速度比开始和结束的时候都要快一些。

 

属性动画的核心在于计算不同时刻Object的属性值。下图指出了Android属性动画相关的几个核心类之间如何协作完成动画的。

 

其中,ValueAnimator记录了动画的相关信息,如属性的起始值和结束值,以及开始动画后,该属性在当前时刻的值(value),动画播放了多长时间等。

在ValueAnimator中有一个TimeInterpolator参数,即时间差值器,它根据时间流逝的百分比来计算当前属性值改变的百分比。在ValueAnimator中还有一个TypeEvaluator参数,即类型估值器,它根据时间差值器来计算在动画播放过程中某一个特定时间Object的属性值。例如,在上面的图2中TimeInterpolator使用的是 AccelerateDecelerateInterpolator ,ValueEvaluator使用的是IntEvaluator。

设计动画的时候,先使用Object、属性起始值、结束值、动画时间等参数创建一个ValueAnimator,然后调用ValueAnimator的start方法开始播放。在动画期间,ValueAnimator根据流逝的时间计算出一个elapsed fraction流逝分数(0----1之间),这个流逝分数描述了动画已经完成了多少,0表示0%即动画还没开始,1表示100%即动画已经全部完成。例如,在上面的图1中,在t=10ms的时候流逝比例为10ms/40ms=0.25。

ValueAnimator计算完流逝分数之后,调用TimeInterpolator根据流逝分数计算interpolated fraction差值分数。例如,在上面图2中,设置的TimeInterpolator是AccelerateDecelerateInterpolator ,在t=10ms的时候,流逝分数是0.25,但是差值分数是0.15(AccelerateDecelerateInterpolator 在开始的时候缓慢加速)。在上面图1中,因为是匀速移动,差值分数一直等于流逝分数。

计算完差值分数之后,ValueAnimator调用TypeEvaluator根据差值分数、属性起始值、结束值来计算属性的最新值。例如,在上面的图2中,在t=10ms时,差值分数为0.15,所以属性的值为0.15*(40-0)=6.

属性动画与视图动画的差异

1)视图动画的对象仅限于View,而且只是View的几个属性(透明度,旋转,缩放,平移)可以做动画。

2)视图动画仅仅影响View的绘制,并没有真正改变View对应的属性值。如针对Button的平移动画,将Button的中心从A点移动到B点,动画完成后Button在B点显示,但如果要点击Button,还是得点A点区域,而不是点B点区域。

3)属性动画则没有视图动画的这些缺点,你可以对任何Object(Views 或者non-Views)的任何属性(如颜色,位置,大小)。

当然,视图动画使用起来更简单。如果视图动画已经满足了你的动画需求,那也没必要说一定要使用属性动画。

相关API

在Android中Animator是属性动画框架的基础,但是我们并不直接使用Animator来设计属性动画。而是使用Animator的三个子类ValueAnimator、ObjectAnimator、AnimatorSet。另外,还提供了一些TimeInterpolator和ValueEvaluator。

先看看Animator相关的类:

Class

Description

ValueAnimator

它实现了属性动画的所有核心功能。属性动画有两个核心部分:1)计算动画属性的值;2)将计算出来的值赋值给该动画属性。ValueAnimator没有实现第2)点功能,因此需要我们自己监听ValueAnimator.AnimatorUpdateListener

并在onAnimationUpdate(ValueAnimator animation)

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值