本篇博客记录一下Android属性动画的基本用法。
1、ValueAnimator
ValueAnimator是属性动画中最重要的一个类,它继承自Animator类,
定义了属性动画中大部分的核心功能,包括计算各个帧的属性值、
处理更新事件、按照属性值的类型控制计算规则等。
一个完整的属性动画由两部分组成:
1、计算动画各个帧的相关属性值。
2、将这些属性值设置给指定的对象。
ValueAnimator为开发者实现了第一部分功能,
第二部分功能由开发者自行设置。
ValueAnimator的构造函数是空实现,一般都是使用类似如下的
静态工厂方法来进行实例化:
.............
public static ValueAnimator ofInt(int... values) {
ValueAnimator anim = new ValueAnimator();
anim.setIntValues(values);
return anim;
}
public static ValueAnimator ofArgb(int... values) {
ValueAnimator anim = new ValueAnimator();
anim.setIntValues(values);
anim.setEvaluator(ArgbEvaluator.getInstance());
return anim;
}
.............
获取到ValueAnimator的实例后,需要设置动画的持续时间、插值方式、重复次数等属性值,
还需要为ValueAnimator注册AnimationUpdateListener监听器,并在这个监听器的onAnimationUpdate
方法中将计算出来的属性值设置给指定对象。
具体的使用方法类似于:
final ImageView imageView = findViewById(R.id.test_view);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new FloatEvaluator(),
1, 0.8f, 0.5f, 0);
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
imageView.setAlpha((float)valueAnimator.getAnimatedValue());
}
});
colorAnimation.setDuration(6000);
colorAnimation.start();
2、ObjectAnimator:单属性变化
ObjectAnimator是ValueAnimator的子类,封装了将属性值设置给指定的对象的动作。
因此在实际开发中使用的最多的就是ObjectAnimator,它在构造实例时就会指定动画作用
的具体对象和对象的属性名,而且一般不需要注册AnimationUpdateListener监听器。
Android提供的属性动画机制,可以很简单地调整视图的属性值,形成动画效果。例如:
.............
//在3s时间内,将mSunView沿着y轴从start移动到end的位置
//其实现的原理是,不断调用mSunView.setY接口,设置其纵坐标
//纵坐标的值,逐渐从start变化到end
ObjectAnimator heightAnimator = ObjectAnimator
.ofFloat(mSunView, "y", start, end)
.setDuration(3000);
//也可以设置插值器,例如逐渐加速等
heightAnimator.setInterpolator(new AccelerateInterpolator());
//动画开始
heightAnimator.start();
............
ObjectAnimator将根据插值器的规则,将属性值从start逐渐变化到end。
不过有的属性值并不适合逐渐变化,例如颜色。
我们知道颜色是用类似于#fcfcb716这种16进制的数字表示的,如果逐渐增加数字,反而会带来剧烈的色彩变化。
此时ObjectAnimator需要借助TypeEvalutor的子类,精确地计算开始到结束间的递增指。例如:
.........