监听器

在很多时候,我们希望可以监听到动画的各种事件,比如动画何时开始,何时结束,然后在开始或者结束的时候去执行一些逻辑处理。这个功能是完全可以实现的,Animator类当中提供了一个addListener()方法,这个方法接收一个AnimatorListener,我们只需要去实现这个AnimatorListener就可以监听动画的各种事件了。

addListener

大家已经知道,ObjectAnimator是继承自ValueAnimator的,而ValueAnimator又是继承自Animator的,因此不管是ValueAnimator还是ObjectAnimator都是可以使用addListener()这个方法的。另外AnimatorSet也是继承自Animator的,因此addListener()这个方法算是个通用的方法。

var animator = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f)
animator.addListener(object : Animator.AnimatorListener {
     override fun onAnimationStart(animation: Animator?) {
     }

     override fun onAnimationEnd(animation: Animator?) {
     }

     override fun onAnimationCancel(animation: Animator?) {
     }

     override fun onAnimationRepeat(animation: Animator?) {
     }

    })

可以看到,我们需要实现接口中的四个方法。

  • onAnimationStart()方法会在动画开始的时候调用
  • onAnimationRepeat()方法会在动画重复执行的时候调用
  • onAnimationEnd()方法会在动画结束的时候调用
  • onAnimationCancel()方法会在动画被取消的时候调用

单独说一下,onAnimationRepeat() 这个方法,一定是要设置

 animator.repeatCount = 3

否则不会回调。
再来看看,setRepeatCount 方法。

// The number of times the animation will repeat. The default is 0, which means the animation
// will play only once
private int mRepeatCount = 0;

...

public void setRepeatCount(int value) {
    mRepeatCount = value;
}

可以看到,mRepeatCount 默认值是0 , 如果我们设置了repeatCount = 3,代表重复执行3次, 那么动画一共会执行4次

但是也许很多时候我们并不想要监听那么多个事件,可能我只想要监听动画结束这一个事件,那么每次都要将四个接口全部实现一遍就显得非常繁琐。没关系,为此Android提供了一个适配器类,叫作AnimatorListenerAdapter,使用这个类就可以解决掉实现接口繁琐的问题了,如下所示:

var animator = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f)
animator.addListener(object : AnimatorListenerAdapter() {
        
})

这里我们向addListener()方法中传入这个适配器对象,由于AnimatorListenerAdapter中已经将每个接口都实现好了,所以这里不用实现任何一个方法也不会报错。那么如果我想监听动画结束这个事件,就只需要单独重写这一个方法就可以了,如下所示:

var animator = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f)
animator.addListener(object : AnimatorListenerAdapter() {
        
    override fun onAnimationCancel(animation: Animator?) {
        super.onAnimationCancel(animation)
   }
})
addUpdateListener
   animator.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener {

        override fun onAnimationUpdate(animation: ValueAnimator) {
            //获取当前值
            val currentValue = animation.animatedValue
        }
    })

removeListener

移除监听器

animator.removeAllListeners()
animator.removeAllUpdateListeners()
animator.removeListener(AnimatorListener listener)
animator.removeUpdateListener(AnimatorUpdateListener listener)
animator.removePauseListener(AnimatorPauseListener listener)
Kotlin 扩展

在 ktx 里面,有 AnimatorKt 对属性动画监听器做了扩展
Android属性动画 监听器、翻转、暂停和恢复_属性动画监听器
举例:

//在动画开始时,doSomething....  相当于 onAnimationStart()
 animator.doOnStart { }

还有其他扩展,我就不举例了

翻转

就是讲动画翻转执行,如果原动画执行到一半的时候,调用reverse() 会将动画从一半的位置翻转执行。

animator.reverse()
暂停、恢复

在 Android 4.4 后,新增了 pause() 、resume() 方法,可以暂停/恢复动画。

//暂停
animator.pause()

//恢复
animator.resume()