转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118794419
本文出自【赵彦军的博客】
监听器
在很多时候,我们希望可以监听到动画的各种事件,比如动画何时开始,何时结束,然后在开始或者结束的时候去执行一些逻辑处理。这个功能是完全可以实现的,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()