WMS 专项 - 窗口布局与 Relayout 机制

窗口添加后,其大小和位置并非一成不变。每当窗口属性变化、输入法弹出或屏幕旋转时,都会触发 relayoutWindow

1. 什么是 Relayout?

relayout 是 WMS 及其客户端(应用进程)最频繁的交互点。它主要完成:

  • 尺寸计算:WMS 根据屏幕大小、Insets(状态栏等占位)计算窗口的最终 Frame。
  • 配置同步:将最新的 Configuration(如横竖屏、语言)同步给应用。
  • Surface 状态变更:控制 Surface 的显示、隐藏或尺寸调整。

2. 核心算法:窗口框架 (Frame) 计算

框架术语 含义描述
parentFrame 父容器(如 Display 或包含它的 Task)给出的参考范围。
displayFrame 窗口在当前屏幕中的可用范围。
contentFrame 扣除状态栏、导航栏等装饰后,真正用于显示内容的范围。
finalFrame 经过 WMS 策略计算后,窗口最终在屏幕上的物理坐标。

3. Insets 机制(现代 Android 重点)

现代 Android 不再简单地减去状态栏高度,而是使用 WindowInsets 机制。WMS 负责计算这些 Insets(如键盘、手势区域)并将其分发给 View 系统,从而实现沉浸式状态栏或避让输入法。

, ,