Animation之Property Animation

Property Animation
Property Animation是android3.0(API Level11)加入的新特性,能对任意对象的任意属性进行动画切换。Property Animation改变特定时间段内属性的值。要实现动画,需要指定对象动画的特性,例如对象在屏幕上的位置,动画持续的时长等。

Property Animation允许你定义的动画的特性有:

l  Duration:动画的持续时间,默认值是300ms。

l  TimeInterpolation:时间差值,定义随着时间的变换,属性值如何变换

l  TypeEvaluator:根据属性的开始、结束值与TimeInterpolation计算出的因子计算出当前时间的属性值

l  Repeat Country and behavoir:重复次数与方式,如播放3次、5次、无限循环,可以此动画一直重复,或播放完时再反向播放

l  Animation sets:动画集合,即可以同时对一个对象应用几个动画,这些动画可以同时播放也可以对不同动画设置不同开始偏移

l  Frame refreash delay:多少时间刷新一次,即每隔多少时间计算一次属性值,默认为10ms,最终刷新时间还受系统进程调度与硬件的影响

Property Animation相关类的继承关系

java.lang.Object

android.animation.Animator   

  ↳android.animation.ValueAnimator     

   ↳android.animation.ObjectAnimator


ObjectAnimator

用ObjectAnimator可以方便快捷的实现动画。使用时注意:

1、ObjectAnimator提供了ofInt、ofFloat、ofObject等几个工厂方法,第一个参数为对象名,第二个为属性名,后面的参数为可变参数,如果values...参数只设置一个值的话,那么会作为目的值,属性的变化范围为当前值到目的值。如果设置两个,则一个为开始值、一个为结束值。

2、实际应用中会用ObjectAnimator改变某一对象的某一属性,使用ObjectAnimator有限制,需要对象有一个setter函数和getter函数,就是set<PropertyName>和get<PropertyName>函数,用来更新某个属性。

3、如果动画的对象的属性方法里面,没有调用view的重绘,则你需要自己按照下面方式手动调用。

anim.addUpdateListener(new AnimatorUpdateListener()
       {
          @Override
          public voidonAnimationUpdate(ValueAnimator animation)
          {
// view.postInvalidate();
// view.invalidate();
              }
       });

ValueAnimator

ValueAnimator有更大的灵活性,不需要操作的对象的属性一定要有getter和setter方法,可以自己根据当前动画的计算值来操作任何属性。

ValueAnimator原理介绍

 ValueAnimator对象持有动画时间,比如动画已经进行了多长时间,和变换的属性的当前值。ValueAnimator中封装了TimeInterpolatorTypeEvaluatorTimeInterpolator定义了动画的时间插值,比如可以线性或者加速减速;TypeEvaluator定义了如何计算被动画改变的属性值。

为了开启一个动画,首先构造一个ValueAnimator对象,把你想要改变的属性值的起始值、终止值以及动画时间告诉它,当你调用 start()方法时,动画开始。

  在整个动画的过程中,所涉及的计算分为下面三步:

  1.这个ValueAnimator对象会根据动画的总时间和已经流逝的时间计算出一个0到1之间的比值(fraction)。这个fraction值就代表了时间完成的程度。

  2.计算出fraction之后,ValueAnimator对象会调用TimeInterpolator 来计算一个interpolatedfraction,即根据所设置的时间插值方法将elapsed fraction映射到interpolated fraction。

  如果是线性插值的话elapsed fraction和interpolated fraction会是一直相等的,但是非线性变换就不是了。

  3. interpolated fraction计算出来后,ValueAnimator 会调用TypeEvaluator,来进行你要动画的属性值的计算。

  这时候用的输入参数就是interpolated fraction的值,以及属性值的起始值和终止值。


ValueAnimator包含Property Animation动画的所有核心功能,如动画时间,开始、结束属性值,相应时间属性值计算方法等。应用Property Animation有两个步聚:

1、计算属性值

2、根据属性值执行相应的动作,如改变对象的某一属性。

ValuAnimiator只完成了第一步工作,如果要完成第二步,需要实现ValueAnimator.onUpdateListener接口,这个接口只有一个函数onAnimationUpdate(),在这个函数中会传入ValueAnimator对象做为参数,通过这个ValueAnimator对象的getAnimatedValue()函数可以得到当前的属性值如:

	ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
               animation.setDuration(1000);
               animation.addUpdateListener(new AnimatorUpdateListener() {
                    @Override
                    publicvoid onAnimationUpdate(ValueAnimator animation) {
                       Log.i("update", ((Float)animation.getAnimatedValue()).toString());
                    }
                });
               animation.setInterpolator(new CycleInterpolator(3));
               animation.start();


TypeEvalutor

根据属性的开始、结束值与TimeInterpolation计算出的因子计算出当前时间的属性值,android提供了以下几个evalutor:

IntEvaluator:属性的值类型为int;

FloatEvaluator:属性的值类型为float;

ArgbEvaluator:属性的值类型为十六进制颜色值;

TypeEvaluator:一个接口,可以通过实现该接口自定义Evaluator。

根据动画执行的时间跟应用的Interplator,会计算出一个0~1之间的因子,即evalute函数中的fraction参数。也就是在TypeEvaluator的evaluator方法中,我们可以自己定义一个规格告诉机器属性怎么变化。

下面是一个例子:

TypeEvaluator typeEvaluator = new TypeEvaluator() {
                    @Override
                    publicObject evaluate(float fraction, Object o, Object o2) {
                       PointF point = new PointF();
                       point.x = (float) (width / 2 + 200 * Math.cos(fraction * 2 *Math.PI));
                       point.y = (float) (height / 2 + 200 * Math.sin(fraction * 2 *Math.PI));
                       return point;
                    }
                };

TimeInterplator

TimeInterplator定义了属性值随时间变化的方式,如线性均匀改变,开始慢然后逐渐快等。

系统提供的插补器有下面几个:

1.AccelerateDecelerateInterpolator 加速减速插补器

2.DecelerateInterpolator 减速插补器

3.AnticipateInterpolator 向前插补器

4.AnticipateOvershootInterpolator 向前向后插补器

5.OvershootInterpolator 超出插补器

还有循环插补器CycleInterpolator 和反弹插补器BounceInterpolator,基本原理都一样,只是函数图象需要做更细的分段处理。


Animator.AnimatorListener

Animator.AnimatorLIstener中要实现onAnimationStart()、onAnimationEnd()、onAnimationRepeat()、onAnimationCancel()(当动画被取消时调用,同时会调用onAnimationEnd())这几个方法。

ValueAnimator.AnimatorUpdateListener

通过监听这个事件在属性的值更新时在onAnimationUpdate()方法中执行相应的操作,对于ValueAnimator一般要监听此事件执行相应的动作,不然Animation没意义,在ObjectAnimator(继承自ValueAnimator)中会自动更新属性,如无必要不必监听。在函数中会传递一个ValueAnimator参数,通过此参数的getAnimatedValue()取得当前动画属性值。

可以继承AnimatorListenerAdapter而不是实现AnimatorListener接口来简化操作,这个类对AnimatorListener中的函数都定义了一个空函数体,这样我们就只用定义想监听的事件而不用实现每个函数却只定义一空函数体。

AnimationSet

可以用AnimationSet实现多个动画

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章