You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android动画首次播放正常后续失效问题求助

问题修复方案

核心问题

首次动画结束后,matchTextView的scaleX/scaleY会停留在动画最终值3f,后续触发时你手动设置的scaleX = 0f/scaleY = 0f会被动画框架的属性状态覆盖;再加上ObjectAnimator.ofFloat只传单一目标值时,会以当前属性值作为起始值,导致缩放动画直接跳过(当前值已等于目标值),只剩淡出动画执行。

修复步骤

  1. 明确缩放动画的起止值:不再依赖当前属性值作为起始点,直接指定从0f到3f,确保每次动画都从缩放为0的状态开始。
  2. 取消未完成的动画:触发新动画前先取消控件上可能仍在运行的动画,避免新旧动画冲突干扰属性状态。
  3. 动画结束后重置属性:在动画结束回调里把缩放和透明度属性重置回初始状态,确保下一次触发时控件处于正确的初始状态。

修复后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:58:15