Android 属性动画(Property Animation)

概述

Property Animation是一个强大的动画框架,它支持对任何对象进行动画操作。你可以定义一个动画让对象的属性随着时间的变化而改变,不管动画是否需要在屏幕上绘制出来。属性动画会在一个特定的时间内改变某个对象的属性值。想要进行动画操作,你需要指定对象动画的属性,如对象在屏幕上的位置,动画的执行时间等。

Android Developer:http://developer.android.com/intl/zh-cn/guide/topics/graphics/prop-animation.html

相关属性值

  • Duration:动画持续时间,setDuration()
  • Time interpolation:插值器,setInterpolator()
  • Repeat count and behavior:动画重复次数和重复方式,setRepeatCount()和setRepeatMode()
  • Animator sets:动画集
  • Frame refresh delay:帧刷新频率

相关API

Animator

创建属性动画的基类,该类通常不会被使用,一般通过继承该类实现属性动画。

  • ValueAnimator:属性动画的主要时间引擎,主要计算属性动画的属性值。属性动画主要由两个功能组成:(1)计算各帧的属性值;(2)为指定对象设置计算的值。ValueAnimator主要负责功能1,如果想通过ValueAnimator实现功能2,需要为ValueAnimator添加AnimatorUpdateListener监听。
  • ObjectAnimator:可以通过为指定对象的属性执行动画。
  • AnimatorSet:属性集,执行组合动画。

Evaluators

用于控制属性动画如何计算属性值。

  • IntEvaluator:int类型默认Evaluator
  • FloatEvaluator:float类型默认Evaluator
  • ArgbEvaluator:16进制RGB颜色类型默认Evaluator
  • TypeEvaluator:Evaluator接口类,可以用于自定义Evaluator

Interpolators

差值器,在 Android 逐帧动画&补间动画 已经介绍。

ValueAnimator

使用ValueAnimator执行动画有以下步骤:

  1. 通过ValueAnimator的ofInt,ofFloat,ofObject的静态方法获得ValueAnimator对象
  2. 设置动画时间,重复方式,重复次数,插值器
  3. 添加AnimatorUpdateListener监听器
  4. 开始动画

如下代码:

/**
* ValueAnimator演示
*/
public void showValueAnimator() {
     ValueAnimator animator = ValueAnimator.ofInt(1, 100);

     //设置动画时间,重复方式,重复次数,插值器
     animator.setDuration(3000);
     animator.setRepeatMode(ValueAnimator.RESTART);
     animator.setRepeatCount(3);
     animator.setInterpolator(new AccelerateInterpolator());

     //添加监听
     animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
         @Override
         public void onAnimationUpdate(ValueAnimator animation) {
             //改变TextView显示的值
             mTvShow.setText(animation.getAnimatedValue() + "");
         }
     });
     animator.start();
}

ObjectAnimator

ObjectAnimator继承自ValueAnimator,它可以将ValueAnimator 计算出来的值直接设置到指定对象的属性上。因此使用ObjectAnimator不需要像ValueAnimator通过注册AnimatorUpdateListener实现动画效果。

如下代码:

/**
* ObjectAnimator演示
*/
public void showObjectAnimator() {
    //定义一个动画平移TextView
      ObjectAnimator animAlpha = ObjectAnimator.ofFloat(mTvShow, "translationX", 0f, 100f);
      animAlpha.setDuration(3000);
      animAlpha.setRepeatMode(ValueAnimator.REVERSE);
      animAlpha.setRepeatCount(3);
      animAlpha.start();
}

在这里需要说明,通过ObjectAnimator的ofInt,ofFloat,ofObject的静态方法获得对象时,需要指定具体的对象及对象属性名。如上述代码的TextView对象mTvShow及它的平移属性translationX。

使用ObjectAnimator注意事项:
1. 指定对象的属性必须添加setter方法,如translationX的setTranslationX,alpha的setAlpha。
2. 通过ofInt,ofFloat,ofObject创建对象时,一般情况下需要指定开始和结束的属性值,如果只指定一个,默认为结束属性值。那么此时需要给属性值添加getter方法,通过调用getter方法将获取到的值作为开始属性值
3. 如果需要显示view的动画效果,需要通过onAnimationUpdate方法调用invalidate()实现。

AnimatorSet

通过AnimatorSet实现组合动画,如下代码:

/**
* AnimatorSet演示
*/
public void showAnimatorSet() {
   ObjectAnimator animTrans = ObjectAnimator.ofFloat(mTvShow, "translationX", 0f, 300f);
   ObjectAnimator animRotation = ObjectAnimator.ofFloat(mTvShow, "rotation", 0f, 360f);
   ObjectAnimator animY = ObjectAnimator.ofFloat(mTvShow, "scaleY", 0.0f, 1.0f);
   ObjectAnimator animAlpha = ObjectAnimator.ofFloat(mTvShow, "alpha", 0.0f, 1.0f);

   AnimatorSet animatorSet = new AnimatorSet();

   //同时行动画
//        animatorSet.playTogether(animTrans, animRotation, animAlpha);

   //顺序执行
//        animatorSet.playSequentially(animTrans, animRotation, animAlpha);

   //自定义顺序
   animatorSet.play(animAlpha).after(animTrans);
   animatorSet.play(animAlpha).before(animRotation);
   animatorSet.play(animRotation).with(animY);

   animatorSet.setDuration(3000);
   animatorSet.start();
 }

KeyFrame和PropertyValuesHolder介绍

KeyFrame

指定动画关键帧,一个KeyFrame对象定义一个time/value键值对(即指定时间点的属性动画的属性值)。

实现步骤:
1. 通过KeyFrame的静态方法ofInt(), ofFloat(), ofObject()获得keyFrame对象
2. 通过PropertyValuesHolder类的ofKeyframe()方法指定属性的关键帧
3. 通过ObjectAnimator的ofPropertyValuesHolder()方法获得ObjectAnimator对象

代码如下:

/**
* 演示KeyFrame
*/
public void showKeyFrame() {
   Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
   Keyframe kf1 = Keyframe.ofFloat(0.5f, 300f);
   Keyframe kf2 = Keyframe.ofFloat(1f, 100f);
   PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
   ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(mTvShow, pvhRotation);
   rotationAnim.setDuration(5000);
   rotationAnim.start();
}

PropertyValuesHolder

PropertyValuesHolder主要用于实现一组动画,使用方法同AnimatorSet类似。

代码如下:

/**
 * 演示PropertyValuesHolder
 */
public void showPropertyValuesHolder() {
    PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("translationX", 0f, 300f);
    PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("rotation", 0f, 360f);
    ObjectAnimator.ofPropertyValuesHolder(mTvShow, pvhX, pvhY).setDuration(2000).start();
}

ViewPropertyAnimator

ViewPropertyAnimator用于对view执行动画操作,使用起来更加方便,只需要调用view的animate()方法即可实现。
代码如下:

/**
 * ViewPropertyAnimator演示
 */
public void showViewPropertyAnimator() {
    mTvShow.animate().setDuration(2000).alpha(1.0f).alpha(0.0f);
    //mTvShow.animate().setDuration(2000).rotation(300f);
}

xml文件定义属性动画

属性动画同帧动画,补间动画一样可以通过xml文件实现。首先创建文件夹res/animator

xml标记说明:

  • ValueAnimator:<animator>
  • ObjectAnimator:<objectAnimator>
  • AnimatorSet:<set>

如下:

//ValueAnimator
<animator xmlns:android="http://schemas.android.com/apk/res/android"
          android:duration="1000"
          android:repeatCount="1"
          android:repeatMode="reverse">
    <propertyValuesHolder>
        <keyframe android:fraction="0" android:value="1"/>
        <keyframe android:fraction=".2" android:value=".4"/>
        <keyframe android:fraction="1" android:value="0"/>
    </propertyValuesHolder>
</animator>
//objectAnimator 
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:propertyName="scaleX"
    android:valueFrom="1.0"
    android:valueTo="2.0"
    android:valueType="floatType" >
</objectAnimator>
//AnimatorSet
<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演示
 */
public void showXml() {
     ObjectAnimator set = (ObjectAnimator) AnimatorInflater.loadAnimator(this,
             R.animator.property_animator);
     set.setTarget(mTvShow);
     set.start();
}

源码下载:http://download.csdn.net/detail/kaifa1321/9464492

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