概述

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

更多相关文章

  1. Android使用SVG矢量图打造酷炫动画效果
  2. Button点击缩放动画效果
  3. android ListView 九大重要属性详细分析、
  4. Android显示GIF动画完整示例(二)
  5. Android M InCallUI动画简析
  6. Java记录 -88- 利用反射机制调用对象的私有方法和属性
  7. 包含带标记的值的XML属性文件
  8. JAVA中的反射只获取属性的get方法
  9. 如何在Spring中读取具有相同键的多个属性?

随机推荐

  1. Android纠正Activity横竖屏切换的生命周
  2. 在Android上远程调试JavaScript
  3. android 开发对gif解码(适配android 4.2、
  4. Develop one game for playing
  5. RealtiveLayout(相对布局属性)
  6. Android Studio apk系统签名和版本描述的
  7. Android RecyclerView DividerItemDecora
  8. Android控件之EditText(输入文本框控件)
  9. Android ListView 解决滑动变黑
  10. Android 图书总汇