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执行动画有以下步骤:
- 通过ValueAnimator的ofInt,ofFloat,ofObject的静态方法获得ValueAnimator对象
- 设置动画时间,重复方式,重复次数,插值器
- 添加AnimatorUpdateListener监听器
- 开始动画
如下代码:
/**
* 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
更多相关文章
- Android使用SVG矢量图打造酷炫动画效果
- Button点击缩放动画效果
- android ListView 九大重要属性详细分析、
- Android显示GIF动画完整示例(二)
- Android M InCallUI动画简析
- Java记录 -88- 利用反射机制调用对象的私有方法和属性
- 包含带标记的值的XML属性文件
- JAVA中的反射只获取属性的get方法
- 如何在Spring中读取具有相同键的多个属性?