Android动画首次播放正常后续失效问题求助
问题修复方案
核心问题
首次动画结束后,matchTextView的scaleX/scaleY会停留在动画最终值3f,后续触发时你手动设置的scaleX = 0f/scaleY = 0f会被动画框架的属性状态覆盖;再加上ObjectAnimator.ofFloat只传单一目标值时,会以当前属性值作为起始值,导致缩放动画直接跳过(当前值已等于目标值),只剩淡出动画执行。
修复步骤
- 明确缩放动画的起止值:不再依赖当前属性值作为起始点,直接指定从
0f到3f,确保每次动画都从缩放为0的状态开始。 - 取消未完成的动画:触发新动画前先取消控件上可能仍在运行的动画,避免新旧动画冲突干扰属性状态。
- 动画结束后重置属性:在动画结束回调里把缩放和透明度属性重置回初始状态,确保下一次触发时控件处于正确的初始状态。
修复后的完整代码
if (wordDirection == "Right") { // 取消控件上所有未完成的动画,避免状态干扰 matchTextView.animate().cancel() // 重置控件到初始状态 matchTextView.scaleX = 0f matchTextView.scaleY = 0f matchTextView.alpha = 1f matchTextView.visibility = View.VISIBLE // 明确指定缩放动画的起止值 val scaleXIn = ObjectAnimator.ofFloat(matchTextView, View.SCALE_X, 0f, 3f) val scaleYIn = ObjectAnimator.ofFloat(matchTextView, View.SCALE_Y, 0f, 3f) val scaleInAnimator = AnimatorSet() scaleInAnimator.playTogether(scaleXIn, scaleYIn) scaleInAnimator.duration = 400 scaleInAnimator.interpolator = AccelerateDecelerateInterpolator() val animatorSet = AnimatorSet() animatorSet.playSequentially( scaleInAnimator, ObjectAnimator.ofFloat(matchTextView, View.ALPHA, 1f, 0f) ) animatorSet.addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { matchTextView.visibility = View.INVISIBLE // 重置属性,为下次动画做准备 matchTextView.scaleX = 0f matchTextView.scaleY = 0f matchTextView.alpha = 1f } }) animatorSet.start() }
内容的提问来源于stack exchange,提问作者TheG
相关产品推荐
相关产品推荐

