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

使用Transition API时,Visibility Transition期间如何禁用View交互?

Transition API动画期间视图可交互问题的原因与解决方案

问题原因

这是Transition API的设计特性,而非bug。Transition框架实现动画的核心逻辑是修改视图的视觉属性(如alpha、translationX/Y等)来完成过渡效果,而视图的visibility状态(GONE/INVISIBLE)以及交互属性(clickable、focusable等),默认是在动画完全结束后才会同步更新。因此在淡出动画执行过程中,视图依然处于可交互状态,会保留焦点、响应点击。

符合要求的解决方案

不需要修改视图原有属性,也不用额外添加拦截包装视图,通过Transition的监听器就能解决:

  • 给目标Transition添加监听器,在动画开始时临时禁用视图的交互能力,动画结束/取消时恢复原有状态。这样既不破坏原有逻辑,也能避免动画期间的误交互。

示例代码:

val fadeTransition = Fade(Fade.OUT)
val targetView = findViewById<View>(R.id.target_view)

// 保存视图原本的交互状态
val originalClickable = targetView.isClickable
val originalFocusable = targetView.isFocusable
val originalFocusableInTouchMode = targetView.isFocusableInTouchMode

fadeTransition.addListener(object : Transition.TransitionListener {
    override fun onTransitionStart(transition: Transition) {
        // 动画开始时禁用交互
        targetView.isClickable = false
        targetView.isFocusable = false
        targetView.isFocusableInTouchMode = false
    }

    override fun onTransitionEnd(transition: Transition) {
        // 动画结束恢复原有状态
        targetView.isClickable = originalClickable
        targetView.isFocusable = originalFocusable
        targetView.isFocusableInTouchMode = originalFocusableInTouchMode
    }

    override fun onTransitionCancel(transition: Transition) {
        // 动画取消也要恢复,避免状态异常
        onTransitionEnd(transition)
    }

    override fun onTransitionPause(transition: Transition) {}
    override fun onTransitionResume(transition: Transition) {}
})

// 执行过渡动画
TransitionManager.beginDelayedTransition(parentLayout, fadeTransition)
targetView.visibility = View.GONE

如果是批量处理多个视图,可以遍历Transition的目标视图集合,批量保存和恢复状态,不用逐个写逻辑。

补充说明

如果使用的是AutoTransition(默认的过渡动画集合),同样可以给它添加上述监听器,逻辑完全一致。这种方案的核心是临时切换状态,并没有修改视图的原有属性配置,完全符合你的要求。

内容的提问来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:46:43