多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 1. 前言 属性动画可以设置监听器来监听动画的播放过程。可以使用两个接口: ~~~java Animator.AnimatorListener ValueAnimator.AnimatorUpdateListener ~~~ 在上一小节中提到:`ValueAnimator`仅为值得变化,直接应用没有动画效果的。如果可以监听到值的变化,然后我们将其值应用到对应的对象的属性上,那么就回产生对应的效果。 # 2. AnimatorUpdateListener监听案例 这里就来做一个简单的案例: ~~~ val start = textView.width Log.e("TAG", "onCreate: ${start}") // 0 val end = 700 // ValueAnimator值变化,这里模拟百分比 val valueAnimator = ValueAnimator.ofInt(1, 100) // 设置监听 valueAnimator.addUpdateListener(object: ValueAnimator.AnimatorUpdateListener{ // 估值器 val intEvaluator: IntEvaluator = IntEvaluator() override fun onAnimationUpdate(animation: ValueAnimator?) { // 模拟进度具体值 // val currentValue = animation?.animatedValue // 获取百分比 val animatedFraction = animation?.animatedFraction // 调用估值器,计算宽度,然后设置给Button val evaluateWidth = intEvaluator.evaluate(animatedFraction!!, start, end) // 变化属性作用于width textView.layoutParams.width = evaluateWidth textView.requestLayout() } }) // 启动 textView.setOnClickListener { valueAnimator.start() } ~~~ 虽然可以启动,然后也能设置`TextView`的`width`属性,但是开始变换的`width`值是从`0`开始的,虽然设置了`textView.width`,但是日志打印结果为`0`,显然是不满足我们的预期的,这里是因为还没有渲染出来,也就是宽度值还没有计算出来。所以直接将代码丢到点击函数中即可: ~~~ textView.setOnClickListener { val start = textView.width val end = 700 // ValueAnimator值变化,这里模拟百分比 val valueAnimator = ValueAnimator.ofInt(1, 100) valueAnimator.duration = 1000 // 设置监听 valueAnimator.addUpdateListener(object: ValueAnimator.AnimatorUpdateListener{ // 估值器 val intEvaluator: IntEvaluator = IntEvaluator() override fun onAnimationUpdate(animation: ValueAnimator?) { // 模拟进度具体值 // val currentValue = animation?.animatedValue // 获取百分比 val animatedFraction = animation?.animatedFraction // 调用估值器,计算宽度,然后设置给Button val evaluateWidth = intEvaluator.evaluate(animatedFraction!!, start, end) // 变化属性作用于width textView.layoutParams.width = evaluateWidth textView.requestLayout() } }) valueAnimator.start() } ~~~ 点击前: ![](https://img.kancloud.cn/d5/8f/d58f550cd16c22246c944e51b70e41d9_156x57.png) 点击后: ![](https://img.kancloud.cn/61/7a/617a0c799987479ab560d619b43cede7_285x94.png) # 3. AnimatorListener监听案例 ~~~ valueAnimator.addListener(object : Animator.AnimatorListener{ override fun onAnimationStart(animation: Animator?) { } override fun onAnimationEnd(animation: Animator?) { } override fun onAnimationCancel(animation: Animator?) { } override fun onAnimationRepeat(animation: Animator?) { } }) ~~~ 但是要实现的方法略多。所以官方提供了`AnimatorListenerAdapter`这个抽象类,用来实现用户所需要的方法。