android页面切换过渡动画xml必须放在res/transition/目录下,需手动创建,仅支持api 21+;组合slide和fade需用并设ordering="together",子节点须为、等合法标签。

transition动画XML文件该放在哪个目录
Android的页面切换过渡动画XML必须放在 res/transition/ 目录下,不是 anim/、animator/ 或 drawable/。放错位置会导致 Resources$NotFoundException 或动画完全不触发。
这个目录需要手动创建(AS不会自动提示),且只支持 API 21+(Lollipop)。低于此版本无法使用 TransitionManager 配合 XML 的方式。
- 路径必须是
src/main/res/transition/,命名如slide_right.xml - build时若报错
error: resource transition/xxx is not a Transition,大概率是文件放错了目录,或根节点不是<transitionset></transitionset>/<changebounds></changebounds>等合法 transition 标签 - 旧项目若已用
overridePendingTransition()配合anim/下的资源,不要混用 —— 两者机制不同,同时调用会冲突
XML里写slide和fade组合动画怎么配
不能直接把 slide_in_right 和 fade_in 两个动画写成并列子节点就完事。Transition XML 的组合逻辑靠 <transitionset></transitionset> 的 ordering 属性控制,且每个子 transition 必须是系统支持的类型(如 <slide></slide>、<fade></fade>、<changebounds></changebounds>)。
常见错误是照搬 anim/ 下的写法,比如用 <alpha></alpha> 或 <translate></translate> —— 这些在 transition/ 下无效,会静默失败。
-
ordering="together"表示所有子 transition 同时执行;"sequential"表示串行(极少用) -
<slide></slide>默认从边缘滑入,用android:slideEdge="end"控制方向(可选start/end/top/bottom) -
<fade></fade>只有进入/退出两种模式,通过父容器的setVisibility()触发,不能手动设 alpha - 示例:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="together"> <slide android:slideEdge="end" /> <fade /> </transitionSet>
为什么TransitionManager.beginDelayedTransition()没反应
最常见原因是目标 View 没有启用 transition 支持:默认情况下,ViewGroup(如 LinearLayout、ConstraintLayout)不会监听子 View 的布局变化,除非显式调用 setTransitionName() 或启用 android:transitionGroup="true"。
另一个隐蔽问题是调用时机——必须在修改 View 属性(如 visibility、layoutParams)之前调用 beginDelayedTransition(),且这些修改需在同一次 UI 线程循环内完成。
- 如果对 Fragment 切换做 transition,别在
onCreateView()里调用beginDelayedTransition(),而应在onViewCreated()后、实际修改视图前 - 对单个 View 做 visibility 切换,需确保其父容器设置了
android:transitionGroup="true",否则Fade类 transition 不生效 - 调试技巧:在
beginDelayedTransition()后加一句Log.d("Trans", "fired"),再确认后续的 View 修改是否真的发生了(比如view.setVisibility(View.GONE)是否被执行)
Activity跳转时explode动画不工作
explode 是系统内置 transition,但只对 Activity 的 enter/exit 生效,且依赖 window 的 decor view 结构。如果你用了自定义主题(比如去掉 ActionBar 或透明状态栏),或者在 onCreate() 中过早调用 getWindow().requestFeature(),可能导致 decor view 初始化异常,explode 就会退化为无动画或闪一下。
更现实的问题是:它不能和 overridePendingTransition() 共存。一旦你手动调了这个方法,系统就会跳过所有基于 Transition 的逻辑。
- 正确做法是在
styles.xml中为 Activity 指定主题,并设置android:windowContentTransitionManager指向一个 XML 文件,而不是在 Java/Kotlin 里调用TransitionManager - XML 中用
<explode></explode>即可,无需额外参数;但要确保 Activity 的 launchMode 不是singleInstance,否则 transition 被禁用 - 真机测试时注意:部分厂商 ROM(如华为 EMUI)会强制关闭非默认 transition,建议用
Build.MANUFACTURER做降级兜底










