Android系统提供三种动画:帧动画、补间动画和属性动画。这里分析总结属性动画。
属性动画相较帧动画和补间动画更强大,帧动画和补间动画只能应用于 View 及其子类,而属性动画可以修改任何对象的属性值,属性值可在指定的一段时间内自动改变,根据对象属性值的变化进而实现更复杂的动画。
1.属性动画的常用设置
//设置属性动画持续时间
animator.setDuration(2000);
//设置属性插值器
animator.setInterpolator(new AccelerateInterpolator());
//设置属性动画重复播放次数
animator.setRepeatCount(0);
//设置属性动画延时播放的时间
animator.setStartDelay(0);
//设置属性动画估值器,用于控制最终属性值(API22)
animator.setCurrentFraction(0.5f);
//设置当前播放时间,其值在Duration范围之内
animator.setCurrentPlayTime(1000);
//设置属性动画估值器,用于控制最终属性值
animator.setEvaluator(new IntEvaluator());
//设置属性动画监听
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.i(TAG, animation.getAnimatedValue() + "");
//
}
});
2.ValueAnimator
ValueAnimator 提供了一个简单的计时引擎,用于执行动画时根据设置的时长以及其他属相完成动画值的计算,然后就可以将动画值设置到合适的目标对象上,使用的插值器默认时 AccelerateDecelerateInterpolator,表示动画开始和结束时较慢,中间加速完成动画。
在 ValueAnimator 中已经内部处理了一些估值器 IntEvaluator 和 FloatEvaluator,也就是说如果使用的时 ofInt 和 ofFloat 方法作为动画的属性值,那么 ValueAnimator 会自动处理 int 和 float 值的变化。ValueAnimator 可以使用代码创建,也可以使用 xml 创建。示例:
ValueAnimator animator = ObjectAnimator.ofFloat(0, 100);
animator.setDuration(2000);
animator.start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float progress = (float) animation.getAnimatedValue();
mProgressBar.setProgress((int) progress);
}
});
3.ObjectAnimator 是 ValueAnimator 的子类,可在目标对象上支持动画属性的设置,在其构造方法中通过参数指定目标对象以及所对应动画属性的名称,然后会相应的执行对应的动画属性的 setter 方法来最终完成动画的执行,也就是说属性动画 ObjectAnimator 最终调用目标对象的 setter 方法完成目标对象属性值的变化,然后相应的改变目标对象的属性,从而实现目标对象的动画效果。以透明度为例:
private void alpha(){
ObjectAnimator animator = ObjectAnimator.ofFloat(ivImage,"alpha",1f,0,2f);
animator.setDuration(3000);
//其他属性动画设置
//...
animator.start();
}
平移、旋转、缩放动画实现方式与上面一样:
Alpha 控制View的透明度
TranslationX控制X方向的位移
TranslationY控制Y方向的位移
ScaleX控制X方向的缩放倍数
ScaleY控制Y方向的缩放倍数
Rotation控制以屏幕方向为轴的旋转度数
RotationX控制以X轴为轴的旋转度数
RotationY控制以Y轴为轴的旋转度数
4.插值器和估值器
插值器(TimeInterpolator) 表示的是整个动画期间动画的变化规律,如加速、减速等。
Android 内置许多插值器,这些插值器基本涵盖了实际开发中的大部分情况。如果内置的插值器不满足需求,也可以自定义插值器。
估值器(TypeEvaluator)表示的是在整个动画期间各时刻属性值的具体变化。