在很多时候,我们希望可以监听到动画的各种事件,比如动画何时开始,何时结束,然后在开始或者结束的时候去执行一些逻辑处理。这个功能是完全可以实现的, 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 对属性动画监听器做了扩展
在这里插入图片描述
举例:

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

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

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

animator.reverse()

暂停、恢复

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

animator.pause() animator.resume() 监听器在很多时候,我们希望可以监听到动画的各种事件,比如动画何时开始,何时结束,然后在开始或者结束的时候去执行一些逻辑处理。这个功能是完全可以实现的,Animator类当中提供了一个addListener()方法,这个方法接收一个AnimatorListener,我们只需要去实现这个AnimatorListener就可以监听动画的各种事件了。大家已经知道,ObjectAnimator是继承自ValueAnimator的,而ValueAnimator又是继承自Animator的,因此不管是ValueAni 一定要坚持创作更多高质量博客哦, 小小红包, 以资鼓励, 更多创作活动请看: 无效数据,你会怎么处理?: https://activity.csdn.net/creatActivity?id=10423?utm_source=csdn_ai_ada_redpacket 可持续能源技术真的能改变世界吗?: https://activity.csdn.net/creatActivity?id=10425?utm_source=csdn_ai_ada_redpacket Microsoft Edge功能测评!: https://activity.csdn.net/creatActivity?id=10403?utm_source=csdn_ai_ada_redpacket 全部创作活动: https://mp.csdn.net/mp_blog/manage/creative?utm_source=csdn_ai_ada_redpacket