Android 属性动画(Property Animation)

来源:互联网 发布:iphone照片批量导入mac 编辑:程序博客网 时间:2024/06/17 05:51

概述

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

0 0
原创粉丝点击