Android中Transition Manager多视图延迟转场失效:底部视图无动画
解决Transition Manager底部视图无动画的问题
嘿,我知道你卡在哪了!你的代码里有两个关键问题导致底部视图没动画效果:
- 连续调用
TransitionManager.beginDelayedTransition()会覆盖之前的过渡配置——这个方法的作用是为接下来的视图变更操作绑定动画,你两次调用后,只有最后一个transitionBottom会生效,transitionTop的设置直接被丢弃了。 - 视图可见性的修改时机不对:应该先配置好过渡动画、调用
beginDelayedTransition,再去改变视图的可见状态,这样TransitionManager才能捕获到视图变化并应用对应的动画。
修复后的完整代码
private void showImageOptions() { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { // 创建顶部和底部的滑动动画 Slide transitionTop = new Slide(Gravity.TOP); Slide transitionBottom = new Slide(Gravity.BOTTOM); transitionTop.setDuration(500); transitionTop.addTarget(imageNameLayout); transitionBottom.setDuration(500); transitionBottom.addTarget(constraintOptions); // 用TransitionSet组合两个动画,让它们同时执行 TransitionSet transitionSet = new TransitionSet(); transitionSet.addTransition(transitionTop); transitionSet.addTransition(transitionBottom); // 只调用一次beginDelayedTransition,绑定组合后的过渡动画 TransitionManager.beginDelayedTransition(rootLayout, transitionSet); } // 在调用beginDelayedTransition之后修改视图可见性 if (imageNameLayout.getVisibility() == View.GONE) { imageNameLayout.setVisibility(View.VISIBLE); constraintOptions.setVisibility(View.VISIBLE); } else { // 补充隐藏逻辑,让动画支持双向触发 imageNameLayout.setVisibility(View.GONE); constraintOptions.setVisibility(View.GONE); } }
关键说明
TransitionSet能把多个过渡动画组合在一起,让顶部和底部视图各自执行对应的滑动动画,不会互相覆盖。- 必须确保视图状态修改在
beginDelayedTransition之后,这样TransitionManager才能正确捕获视图变化并触发动画。 - 我补充了隐藏布局的逻辑,这样你的动画在收起视图时也能正常生效。
内容的提问来源于stack exchange,提问作者Junaid Khan
相关产品推荐
相关产品推荐

