窗口动画,可以理解为是WMS这个"舞台导演"为了让界面切换更丝滑,而编排的一系列"舞台特效"。它的核心原理,可以拆解为四个层层递进的环节:动画的本质、类型、执行过程,以及最终的呈现方式。
✨ 动画的本质:一场持续的"视觉变换"
从数学和图形学的角度来看,窗口动画的本质并不神秘,它就是对窗口的原始画面,持续地应用一个变换矩阵(Transformation Matrix) 。这个矩阵可以驱动窗口进行平移(改变位置)、旋转(改变方向)、缩放(改变大小)和 Alpha 混合(改变透明度)。WMS 的核心任务之一,就是以每秒60帧(60fps)的频率,不断地为每个正在播放动画的窗口计算出新的变换矩阵,并交由SurfaceFlinger执行,从而在人眼看来,就形成了连续的动画效果。
🧩 动画的三大基石:三种类型的叠加
一个窗口在显示或隐藏的过程中,其最终呈现的动画效果,往往不是单一的,而是由以下三种动画类型叠加而成的:
| 动画类型 | 描述与来源 | 特点 |
|---|---|---|
| Self Transformation | 窗口自身携带的进入/退出动画。例如,通过overridePendingTransition()为Activity设置的动画。 |
只作用于该窗口本身。 |
| Attached Transformation | 从父窗口或宿主窗口传递而来的动画。例如,一个对话框(Dialog)会跟随其所属Activity的动画一起动。 | 体现了窗口之间的依附关系,保证了视觉上的一致性。 |
| App Transformation | 由Activity组件切换(App Transition)触发的动画。例如,从A界面跳转到B界面时,系统为这两个窗口设置的"打开/关闭"动画。 | 由WMS统一管理,用于实现更复杂的、涉及多个窗口的转场效果。 |
WMS中的动画管理者 WindowAnimator ,会负责将这三种变换矩阵实时地合成为一个,最终应用到窗口上。
⚙️ 动画的执行引擎:从状态到事务
动画的执行是一个动态推进的过程,涉及到窗口状态的变更和最终指令的下达。
-
动画的设置与状态机 :无论是窗口打开时的进入动画,还是关闭时的退出动画,最终都会调用到
WindowManagerService.applyAnimationLocked()方法。这个方法会根据窗口类型和动画类型,为窗口创建一个Animation对象。同时,WMS内部为每个窗口维护了一个精细的状态机,记录其在动画生命周期中的不同阶段:DRAW_PENDING:窗口已创建Surface,但内容尚未绘制。COMMIT_DRAW_PENDING:窗口内容已绘制完成,正在等待提交显示。READY_TO_SHOW:动画已准备就绪,可以开始播放。HAS_DRAWN:窗口内容已首次显示在屏幕上。
当窗口状态变化时,会驱动这个状态机流转,从而触发或结束相应的动画。
-
动画的推动与同步 :动画不会凭空自动播放。
WindowAnimator会负责定期(通常是每个垂直同步信号,VSync)去"推动"每个活跃动画的进度。它会根据当前时间,计算出动画应该进行到了哪一帧,并更新对应的变换矩阵。关键的一点是,WMS 会通过SurfaceControl.Transaction将这些动画指令(即新的位置、大小、透明度等属性)批量打包,然后统一提交给SurfaceFlinger执行。这种方式保证了多个窗口动画之间的同步和一致性。
🔄 动画的终章:呈现与交互
理解了动画的内部机制后,我们再把它放回整个窗口管理的大框架中,看看它与我们之前讨论过的其他概念是如何衔接的。
- 与Z轴顺序的协同 :在动画播放期间,为了确保视觉效果流畅(例如,一个窗口正在放大进入时不被其他窗口遮挡),WMS可能会临时提升该窗口的Z轴顺序(layer值)。动画结束后,再将其恢复到正常层级。
- 特殊的App Transition:Activity切换动画(App Transition)是一个更上层的概念,它由AMS(ActivityManagerService)在启动Activity时发起请求,WMS负责准备和执行。它不仅仅是单个窗口的动画,而是协调新旧两个Activity窗口,让它们按照预设的轨迹(如"新窗口从右边滑入,旧窗口淡出")共同完成一场"舞台剧"。
- 与绘制流程的衔接 :动画的流畅进行离不开高效的绘制。应用进程通过
ViewRootImpl完成View的测量、布局和绘制后,会通过finishDrawingWindow()通知WMS。WMS在收到通知并处理好动画状态后,最终也是通过SurfaceControl.Transaction将最终的合成指令(包含了窗口的UI内容和动画属性)发给SurfaceFlinger。
下面这张流程图,可以帮你更直观地理解动画从设置到最终显示的完整流程:

希望这次的讲解能帮你构建起对 WMS 窗口动画的完整认识。如果你对其中某个环节,比如 App Transition 的具体实现或 SurfaceControl.Transaction 的工作原理特别感兴趣,我们可以继续深入探讨。