窗口子系统位于 \fundation\windowmanager 目录下,提供对窗口与 Display 管理的基础能力
概览
窗口是什么
每个 Ability 在创建时都会创建一个主窗口,并且为该窗口设置 ACE 中的 UIContent 用于加载展示 UI 界面。基本上所有的 UI 视图都是在窗口中展示的,比如弹窗、toast、系统状态栏导航栏、应用等。因此窗口子系统是系统图形界面显示所需的基础子系统。
窗口的种类
- 主窗口: 应用显示的主窗口,即每个 Ability 持有的主窗口
- 子窗口: 必须依附于主窗口来创建与显示
- 系统窗口 :其他窗口均属于系统窗口
窗口的属性
WindowFlag
flag 指定窗口的部分测量规则:
-
WINDOW_FLAG_NEED_AVOID 是否避开区域,默认避开,比如状态栏导航栏区域
-
WINDOW_FLAG_PARENT_LIMIT 是否受到父窗口的限制,默认不限制,如果限制,则宽高不能超过父窗口,需与 WINDOW_MODE_FLOATING 配合使用
WindowMode
mode 指定窗口的布局规则: -
WINDOW_MODE_UNDEFINED 默认模式,默认宽高为 display 宽高减去状态栏导航栏等的宽高
-
WINDOW_MODE_FULLSCREEN 全屏模式,但需要与 * * * WINDOW_FLAG_NEED_AVOID 一起使用,默认宽高为 display 宽高
-
WINDOW_MODE_SPLIT_PRIMARY 分屏主窗口模式,如果是横屏则位于左侧,竖屏位于上方
-
WINDOW_MODE_SPLIT_SECONDARY 分屏副窗口模式,如果是横屏则位于右侧,竖屏位于下方
-
WINDOW_MODE_FLOATING 悬浮模式,悬浮窗口可以通过窗口边缘改变窗口大小,默认宽高为 display 宽高的 3/4
应用主窗口可以通过启动 ability 时的参数 Want::PARAM_RESV_WINDOW_MODE(ohos.aafwk.param.windowMode)来侧面指定 WindowMode 的值
priority
窗口优先级决定了窗口的层级,priority 越大窗口越靠近顶部。该属性位于 WindowNode 内,且只能由 WindowType 决定。
WindowType
窗口类型的改变会引起 flag、mode、priority 或其他属性的改变,从而达到改变窗口的测量、排列与层级的目的。如:
- WINDOW_TYPE_STATUS_BAR
property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
property_->SetFocusable(false);
- WINDOW_TYPE_KEYGUARD
RemoveWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID);
SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
层级则是由 WindowType 的 Priority 值与类型共同决定,同类型取值越大层级越高,WindowType 的 Priority 定义位于 foundation\windowmanager\wmserver\include\window_zorder_policy.h
中,如:
-
WINDOW_TYPE_WALLPAPER = 0
-
WINDOW_TYPE_DESKTOP = 1
-
WINDOW_TYPE_APP_MAIN_WINDOW = 0
-
WINDOW_TYPE_APP_SUB_WINDOW = 1
-
WINDOW_TYPE_STATUS_BAR = 110
-
WINDOW_TYPE_KEYGUARD = 114
-
WINDOW_TYPE_BOOT_ANIMATION = 117
WindowType 的类型则有三种: -
BelowApp 位于底层,如桌面、壁纸等
-
App 位于中间,如应用主窗口、子窗口
-
AboveApp 位于上方