转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118699073
本文出自【赵彦军的博客】
文章目录
- ValueAnimator
- 例子1: 透明度渐变
- 例子2:倒计时
ValueAnimator
Animator 是一个抽象类
public abstract class Animator implements Cloneable {
public void start() {
}
public void cancel() {
}
public void end() {
}
......
}
ValueAnimator
public class ValueAnimator extends Animator implements AnimationHandler.AnimationFrameCallback {
}
ValueAnimator
是整个属性动画机制当中最核心的一个类,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由
ValueAnimator
这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给
ValueAnimator
,并且告诉它动画所需运行的时长,那么
ValueAnimator
就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,
ValueAnimator
还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。
但是
ValueAnimator
的用法却一点都不复杂,我们先从最简单的功能看起吧,比如说想要将一个值从
0平滑过渡到1,时长300毫秒
,就可以这样写:
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.start()
怎么样?很简单吧,调用
ValueAnimator
的
ofFloat()
方法就可以构建出一个
ValueAnimator
的实例,
ofFloat()
方法当中允许传入多个
float
类型的参数,这里传入0和1就表示将值从0平滑过渡到1,然后调用
ValueAnimator
的setDuration()方法来设置动画运行的时长,最后调用
start()
方法启动动画。
用法就是这么简单,现在如果你运行一下上面的代码,动画就会执行了。可是这只是一个将值从0过渡到1的动画,又看不到任何界面效果,我们怎样才能知道这个动画是不是已经真正运行了呢?这就需要借助监听器来实现了,如下所示:
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
Log.d("TAG", "cuurent value is " + currentValue);
}
});
anim.start();
可以看到,这里我们通过addUpdateListener()方法来添加一个动画的监听器,在动画执行的过程中会不断地进行回调,我们只需要在回调方法当中将当前的值取出并打印出来,就可以知道动画有没有真正运行了。运行上述代码,控制台打印如下所示:

从打印日志的值我们就可以看出,ValueAnimator确实已经在正常工作了,值在300毫秒的时间内从0平滑过渡到了1,而这个计算工作就是由ValueAnimator帮助我们完成的。另外ofFloat()方法当中是可以传入任意多个参数的,因此我们还可以构建出更加复杂的动画逻辑,比如说将一个值在5秒内从0过渡到5,再过渡到3,再过渡到10,就可以这样写:
ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);
anim.setDuration(5000);
anim.start();
当然也许你并不需要小数位数的动画过渡,可能你只是希望将一个整数值从0平滑地过渡到100,那么也很简单,只需要调用ValueAnimator的ofInt()方法就可以了,如下所示:
ValueAnimator当中最常用的应该就是
ofFloat()
和
ofInt()
这两个方法了,另外还有一个
ofObject()
方法,我会在下篇文章进行讲解。
那么除此之外,我们还可以调用
setStartDelay()
方法来设置动画延迟播放的时间,调用
setRepeatCount()
和
setRepeatMode()
方法来设置动画循环播放的次数以及循环播放的模式,循环模式包括
RESTART
和
REVERSE
两种,分别表示重新播放和倒序播放的意思。这些方法都很简单,我就不再进行详细讲解了。
例子1: 透明度渐变
把
View
的
alpha
值,从
1 -- 0.4
val progress: ValueAnimator = ValueAnimator.ofFloat(1f, 0.4f)
progress.duration = 1000
progress.addUpdateListener {
val currentValue: Float = it.animatedValue as Float
view.alpha = currentValue
}
progress.start()
例子2:倒计时
val progress: ValueAnimator = ValueAnimator.ofInt(60, 0)
progress.duration = 6000 //6秒
progress.startDelay = 500
progress.interpolator = LinearInterpolator()
progress.addUpdateListener {
val currentValue: Int = it.animatedValue as Int
button.text = "$currentValue"
}
progress.start()