天天看点

Android属性动画 ValueAnimatorValueAnimator例子1: 透明度渐变例子2:倒计时

转载请标明出处: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()方法来添加一个动画的监听器,在动画执行的过程中会不断地进行回调,我们只需要在回调方法当中将当前的值取出并打印出来,就可以知道动画有没有真正运行了。运行上述代码,控制台打印如下所示:

Android属性动画 ValueAnimatorValueAnimator例子1: 透明度渐变例子2:倒计时

从打印日志的值我们就可以看出,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()
           
Android属性动画 ValueAnimatorValueAnimator例子1: 透明度渐变例子2:倒计时

例子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()
           
Android属性动画 ValueAnimatorValueAnimator例子1: 透明度渐变例子2:倒计时