Android开发

译Google官方文档:Android属性动画

2016-08-04  本文已影响272人  人失格

属性动画简介


属性动画系统是一个强大的框架,可以让任何对象加上动画效果。随着时间的推移,您可以定义一个动画来改变任何对象属性,无论它是否显示在屏幕上。在指定的时间长度,属性动画改变属性值(对象的字段)。通过指定对象属性来创造动画效果,比如View在屏幕上的位置,动画的时长,以及动画值的改变。

属性动画系统可以让您定义一个动画的以下特征:

属性动画如何工作


首先,让我们用一个简单的例子来说明一个动画。图1描绘了一个假设的对象,它的X属性是动画的,它代表了它在屏幕上的水平位置。动画的持续时间设置为40毫秒,和旅行的距离为40像素。每10毫秒,这是默认的帧刷新率,对象水平移动10个像素。在为结束,动画停止,和物体两端在水平位置40。这是一个用线性插值动画的例子,这意味着对象以一个恒定的速度移动。

animation-linear.png

你也可以指定动画有一个非线性插值。图2说明了一个假设的对象,在动画开始时加速,然后减速动画结束时。该对象仍然在40毫秒内移动40个像素,但非线性。在开始的时候,这个动画加速到中途点,然后从中途点减速直到动画结束。如图2所示,在动画的开始和结束的距离是小于在中间。


animation-nonlinear.png

接下来看看属性动画系统的重要组成部分是如何计算像上面所示的动画的动画系统。图3描述了主类是如何相互工作的。

valueanimator.png

ValueAnimator对象保持跟踪在动画的整个运行时间,如动画已经运行多久,当前动画的值。
ValueAnimator封装Timeinterpolator和TypeEvaluator,它定义了如何计算对象被动画对应的值。例如,在图2中,使用的timeinterpolator对应AccelerateDecelerateInterpolator,TypeEvaluator对应intevaluator。

当开始一个动画,创建一个ValueAnimator并给它动画的开始和结束值的属性,以及动画的持续时间。当你调用start()方法时 动画开始。整个动画中,ValueAnimator计算一个百分比,基于动画的持续时间和经过了多少时间。经过的数值表示动画已完成的时间的百分比,0的意思表示 动画进行了0%和1的意思表示动画进行100%。例如,在图1中,在T = 10毫秒的经过的分数将是0.25,因为总的持续时间是t = 40毫秒。

当ValueAnimator完成计算一个动画时长段,它调用当前设置的TimeInterpolator为计算后的间插值。间插值将所需的值映射到一个新的值作为间插值,即设置。例如,在图2中,因为动画慢慢加速,间插值为0.15,小于所经过的值0.25,在T = 10毫秒。在图1中,差值部分始终是相同的。

API 概述


你可以找到大部分的API android.animation属性动画系统。因为视图动画系统已经定义了多种插值算法在android.view.animation,你可以在属性动画系统使用插值以及。下面的表格描述了属性动画系统的主要组件。

Animators提供了用于创建动画的基本结构。你通常不直接使用这个类,它只提供最低限度的功能,必须扩展到完全支持动画。下面的子类扩展的动画类:

Table 1. Animators


Evaluators告诉属性动画系统如何计算属性值。他们是由动画类提供的时序数据,动画的开始和结束值,并计算动画数据变化在这个数据基础上。属性动画系统提供以下Evaluators:

Table 2. Evaluators


插补器(interpolator )定义了一个动画中的特定值作为时间的函数的计算。例如,您可以指定在整个动画过程中线性的动画,使动画在整个时间内均匀地移动,或者你可以指定要使用的非线性的动画,加速开始,减速结束动画时。

Table 3.插补器 Interpolators

其变化率开始和结束缓慢而在中间加速。

其变化率开始缓慢,然后加快。

刚开始向后。然后向前滑动。

刚开始向后,然后超过原来的值,最后返回到最后的值。

值到最后会回弹。

重复指定的次数。

其变化率开始快,然后减速。

变化率不远,匀速。

值的变化将超过起始值和最后值,然后回来。

一个接口,允许你实现你自己的插补值。

使用ValueAnimator


ValueAnimator类允许你通过指定一组int,float,或色彩值来创建动画。你调用它的一个工厂方法:ofint(),offloat(),或ofobject()来得到一个ValueAnimator。例如:

    ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
    animation.setDuration(1000);animation.start();

在这段代码中,start()方法运行时,在时间为1000毫秒期间,ValueAnimator开始在0和1之间计算动画的值。
您还可以通过以下方式指定一个自定义类型来动画:

    ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(),   startPropertyValue, endPropertyValue);
    animation.setDuration(1000);
    animation.start();

使用ObjectAnimator


objectanimator 是ValueAnimator子类,直接利用ValueAnimator值来更新对象的属性值。这使得动画物体容易得多,因为你不再需要实施valueanimator.animator updatelistener,因为动画属性会根据你的设定的值自动更新。

      ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);
      anim.setDuration(1000);
      anim.start();

想要正确的使用objectanimator更新属性,你必须做到以下几点:

用AnimatorSet编排多个动画

在很多情况下,你想开始一个动画,这取决于当另一个动画开始或结束。Android系统让你动画捆绑为一个AnimatorSet,这样你就可以同时指定是否开始动画,顺序,或在指定的延迟。

  1. Plays bounceAnim.

  2. 同时 Plays squashAnim1, squashAnim2, stretchAnim1, and stretchAnim2。

  3. Plays bounceBackAnim

  4. Plays fadeAnim

     AnimatorSet bouncer = new AnimatorSet();
     bouncer.play(bounceAnim).before(squashAnim1);
     bouncer.play(squashAnim1).with(squashAnim2);
     bouncer.play(squashAnim1).with(stretchAnim1);
     bouncer.play(squashAnim1).with(stretchAnim2);
     bouncer.play(bounceBackAnim).after(stretchAnim2);
     ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
     fadeAnim.setDuration(250);
     AnimatorSet animatorSet = new AnimatorSet();
     animatorSet.play(bouncer).before(fadeAnim);animatorSet.start(); 
    

动画监听器


使用动画


属性动画通过在屏幕上通过改变实际的属性来改变View。此外,View还自动调用invalidate()方法来刷新屏幕在其属性被更改时。视图类的新属性,促进属性动画:

使用插值器

interpolator 定义特定的值如何计算作为时间的函数。例如,您可以指定在整个动画动画发生线性,这意味着动画动作均匀,或您可以指定动画使用非线性时间,例如,使用加速或减速的开始或者结束动画。在interpolator 系统接收来自动画的一小部分代表动画的运行时间。interpolator 修改这部分动画的值,并返回动画。

AccelerateDecelerateInterpolator

 public float getInterpolation(float input) {    return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;}

LinearInterpolator

 public float getInterpolation(float input) {    return input;}
Interpolator.png

从XML使用动画


属性动画系统允许您声明属性动画使用XML而不是做编程。通过定义你的动画在XML中,可以很容易地重用你的动画更容易在多个活动和编辑动画序列。
区分动画文件使用新的属性动画api从那些使用传统视图动画框架,从Android 3.1开始,你应该保存XML文件属性动画在res/animator/(而不是res/anim/)。使用 animator 名称是可选的,但必要的如果你想要使用的布局编辑器工具在Eclipse ADT插件(ADT 11.0.0 +), 因为ADT只搜索res/animator/ 属性动画资源。

以下属性动画类XML声明支持以下XML标记:

下面的例子中两组对象动画顺序,第一个嵌套组开始两个对象的动画:

<set android:ordering="sequentially">  
  <set>        
      <objectAnimator           
              android:propertyName="x"            
              android:duration="500" 
              android:valueTo="400"
              android:valueType="intType"/> 
   <objectAnimator
              android:propertyName="y"
              android:duration="500"
              android:valueTo="300" 
              android:valueType="intType"/>
  </set>
    <objectAnimator        
          android:propertyName="alpha" 
          android:duration="500"
          android:valueTo="1f"/>
</set>

为了运行这个动画,必须增加代码中的XML资源AnimatorSet对象,然后设置目标对象的所有动画在动画开始前集。调用setTarget()设置一个目标对象的所有子AnimatorSet。

  AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,    R.anim.property_animator);
  set.setTarget(myObject);
  set.start();
上一篇 下一篇

猜你喜欢

热点阅读