TransitionSet 默认并行执行子动画,需显式设 ordering="sequential" 才串行;子 transition 未设 duration 会继承父级值,易导致动画异常或跳过。

transitionSet 里嵌套多个 transition 不生效?
Android 的 TransitionSet 本身不会自动按顺序播放子 transition,它默认是并行执行的。如果你写了 ChangeBounds + Fade 却只看到位置动了、没淡入淡出,大概率是没关掉 ordering 或没设 duration 冲突。
-
ordering属性必须显式设为sequential才能串行;默认值是together - 子 transition 的
duration值如果没写,会继承TransitionSet的 duration,容易导致部分动画被“压扁”或跳过 - 某些 transition(比如
ChangeImageTransform)在低版本(
怎么让 Fade 和 ChangeBounds 真正串行执行?
不是把两个 transition 往 TransitionSet 里一丢就完事。关键在 timing 控制和生命周期对齐:Fade 要作用在进入/退出的 View 上,而 ChangeBounds 只对布局变化敏感;两者触发时机不同,硬串容易出现“先淡再动”或“动完才淡”的错位。
- 用
android:ordering="sequential"强制顺序 - 给
Fade设android:duration="300",ChangeBounds设android:duration="200",避免 duration 继承干扰 - 确保目标 View 在 transition 开始前已 attach 到 window,否则
Fade可能拿不到 visibility 状态 - 别在
onCreate()里直接 setEnterTransition(),等supportPostponeEnterTransition()配合图片加载完成后再 start
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequential">
<fade android:duration="300" />
<changeBounds android:duration="200" />
</transitionSet>
TransitionSet 中的 duration 和子 transition duration 怎么算?
整个 TransitionSet 的总耗时 ≠ 所有子 transition duration 相加。它只影响未显式设 duration 的子项;一旦某个子 transition 自己写了 android:duration,就完全忽略父级设置。
- 如果
TransitionSet设了android:duration="500",但里面Fade写了android:duration="200",那 Fade 就真跑 200ms - 没写 duration 的子 transition(比如空的
ChangeClipBounds)会取TransitionSet的 500ms - 串行模式下,总耗时 ≈ 各子项 duration 之和;并行模式下,总耗时 ≈ 最长那个子项的 duration
为什么 XML 里用了 TransitionSet,代码里 setExitTransition 却没反应?
XML 定义只是声明,真正起作用要靠 Java/Kotlin 侧正确绑定。常见断点在于:过渡动画只对 Activity/Fragment 的 enter/exit/reenter/return 四种场景生效,且必须在目标页面创建前设置,不能等 View 绘制完再设。
- Activity 场景:必须在
startActivity()前调用overridePendingTransition(),且 target Activity 的getWindow().setExitTransition()要在onCreate()的 super.onCreate() 之后、setContentView() 之前 - Fragment 场景:必须用
setReorderingAllowed(true),否则即使 XML 里是 sequential,系统也可能优化成 together - 如果用的是
MaterialContainerTransform,它不兼容传统TransitionSet,混用会导致 XML 被忽略
order 写成 ordering)也不会报错,只会静默退化成默认行为——这是最常被忽略的调试盲区。










