和过渡动画
启动新的 Activity 时的过渡动画(Transition Animation)与StartWindow(启动窗口)是两个不同但有一定关联的概念,下面是它们之间的关系详解:
一、StartWindow 是什么?
StartWindow(也叫 StartingWindow)是 Android 在启动新 Activity 时,由系统为你临时绘制的一个 UI 窗口,用于:
- 减少“白屏”时间;
- 在新 Activity 还没 onCreate 前就显示内容;
- 通常显示应用图标 + 主题背景(如果你设置了 windowBackground 和 windowSplashScreenAnimatedIcon 等);
- 出现在应用的冷启动或某些热启动时,新的 Activity 启动但还没完成绘制之前。
二、过渡动画是什么?
过渡动画是你启动 Activity 时,系统用来过渡显示新旧界面的一种视觉效果(如滑入、渐隐、共享元素等):
- 默认动画由系统提供;
- 可以通过 overridePendingTransition() 自定义;
- 可以是窗口层面的动画(如 windowEnterAnimation);
- Android 5.0+ 引入的 ActivityOptions.makeSceneTransitionAnimation() 支持共享元素动画。
三、两者的关系
方面 | StartWindow | Transition Animation |
---|---|---|
显示时机 | Activity 启动前的临时窗口 | 新旧 Activity 切换过程 |
是否参与动画 | 通常不参与过渡动画 | 是动画的核心参与者 |
谁控制 | 系统控制(可配置主题) | 开发者控制(overridePendingTransition 或 ActivityOptions) |
替代关系 | 如果动画很快完成,可以几乎不看到 StartWindow | 动画和 StartWindow 可以无缝接力 |
举个例子:
你从 A 启动 B:
- 系统为 B 显示一个 StartWindow(比如浅灰背景+logo);
- B 的进程准备好后,StartWindow 被真正的 B Activity 内容替换;
- 同时,A → B 可能伴随一个滑动动画;
- 如果 B 很快绘制完成,StartWindow 可能一闪而过;
- 如果 B 比较慢,就会先看到 StartWindow,再过渡到 B。
四、特别注意
- Android 12 引入 SplashScreen API 后,StartWindow 可以变得更“动画化”,可以配置 Logo 动画、背景过渡等,使 StartWindow 和 Activity 的 enter transition 更自然衔接。
- 如果你设置了复杂的 Activity Transition(比如共享元素),系统会尽量隐藏或快速移除 StartWindow,避免出现“突然切换”或闪动。
总结
启动新的 Activity 时,过渡动画与 StartWindow 是两个阶段的视觉体验:StartWindow 是内容准备前的填补物,而过渡动画是两个 Activity 之间的视觉桥梁。它们有衔接关系,但功能上是分开的。