使用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
相关产品推荐
相关产品推荐

