绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
OpenHarmony 3.1 Release版本关键特性解析——构建OpenHarmony窗口框架
2022-05-24 10:12:13

周耀颖
OpenHarmony图形SIG成员
华为技术有限公司图形专家

一、什么是窗口系统

窗口系统的作用,是提供一种机制,在同一块物理屏幕上使多个应用界面能够显示和交互。窗口作为应用的界面显示容器,各应用程序的开发者只需要实现被分配部分的显示区域内的交互界面即可,窗口系统会将这些交互界面组织成终用户见到的形态。
对应用开发者而言,窗口系统提供了界面显示和交互能力的抽象;对用户而言,窗口系统提供了控制应用界面的方式;对整个操作系统而言,窗口系统提供了不同应用显示界面的组织管理逻辑。

二、为什么我们需要多窗口能力

对个人办公电脑这样的生产力设备而言,用户需要同时显示多个应用以提升办公效率,并且用户已经十分习惯了多个窗口层叠排布的组织形式,这也是主流桌面系统都在采用的窗口形式。
对移动终端而言,实际上大部分时候用户仍然在使用多窗口,比如在 OpenAtom OpenHarmony(以下简称“OpenHarmony”)中,状态栏、导航栏、壁纸也是独立窗口,当用户在桌面上时实际上已经存在 4 个窗口了。使用普通应用时的多窗口场景则包含分屏模式以及悬浮窗功能。对某些特定场景而言,多窗口功能也是十分重要的,例如车机在导航场景时,如果还需要进行其他任务,就需要进入分屏模式。

三、OpenHarmony多窗口框架介绍

对 OpenHarmony 来说,一个明显的挑战是 OpenHarmony 所面向的设备形态是不确定的,从几百兆内存的嵌入式设备,到个人办公设备,都有可能在 OpenHarmony 需要支持的设备范围之内,而这些设备对多窗口的诉求差距较大,因此 OpenHarmony 窗口框架的目标是提供构建这些设备图形界面所需要的能力,但又尽可能保持足够的灵活性,允许系统进行策略配置或者二次开发来达成各自不同的诉求。

1. OpenHarmony窗口框架职责介绍

在 OpenHarmony 中,窗口系统主要负责以下职责:
  • 提供应用和系统显示界面的窗口抽象:
为了将图形界面显示在屏幕上,应用和系统需要向窗口系统申请窗口对象,这通常代表了屏幕上一块矩形区域,具有位置、宽高和叠加层次(Z 轴)属性。同时,窗口对象也负责加载界面中 UI 框架的根节点,应用程序的 UI 界面就通过这个根节点在窗口中加载显示。
  • 组织不同窗口的显示关系,包括叠加层级和位置属性:
窗口系统维护不同窗口间的叠加层次。应用和系统的窗口具有多种类型,不同类型的窗口具有不同的叠加层次(Z 轴高度)。窗口系统负责给不同类型的窗口定义默认的层次范围,并根据用户操作更新窗口层次,即用户的操作也可以改变用户窗口的叠加层次。例如,通过点击或者触摸操作,用户可以将选中的窗口在用户界面的前台展示。
窗口系统维护不同窗口的位置属性。窗口系统负责给不同类型窗口定义默认的位置和大小,并根据应用层对于窗口位置和大小的偏好设定进行实际调整。不同的窗口类型有不同的默认位置和大小。例如,导航栏、音量条、壁纸等系统窗口均有各自固定的显示位置和窗口大小,而应用窗口的显示位置和显示大小则可以根据窗口显示模式和用户操作在一定范围内调整。
  • 设置窗口装饰:
在自由窗口等模式中,窗口系统会通知 ArkUI 在应用窗口外部增加窗口装饰。窗口装饰通常包含对窗口进行大化、小化及关闭按钮等界面元素,方便用户进行操作。

  • 设置窗口动画:
在窗口显示、隐藏、和窗口间切换时,通常会有一组动画效果使得整个交互过程更加连贯流畅。窗口系统负责设置窗口的动画参数,完成动画效果。
  • 指导输入事件分发:
输入事件通常可以分为指向性输入(如触摸事件、鼠标事件)和非指向性输入(如按键)。指向性输入事件通常与显示屏的某个坐标关联,事件分发时需要根据当前窗口系统的状态,将事件分发给在这个位置显示的窗口;非指向性输入事件则通常与当前的焦点窗口关联,事件分发时需要根据当前的焦点窗口,将事件分发给当前的窗口。

  • 组织窗口内容的显示:
各应用输出的显示内容,终会被组合成一张显示画面输出给物理屏幕,而窗口系统负责向 RenderServer 提供每个显示内容的位置、大小、层级,使得每个界面被正确组合。

2. OpenHarmony窗口类型定义

OpenHarmony 的窗口分为系统窗口和应用窗口两个类别,而应用窗口又分为应用主窗口和应用子窗口两种类型。
  • 系统窗口
系统窗口指完成系统特定功能的窗口类型。通常来说,系统窗口不允许三方应用创建,也不是由界面 Ability 默认创建,而是由系统应用手动添加的。
系统窗口可以被系统应用直接添加、移除、改变大小,系统应用的直接操作给予系统应用足够的灵活度应对不同产品和 UI 设计的变更。
  • 应用主窗口
应用主窗口是由界面 Ability 默认为应用创建、加载的,用于显示应用界面的窗口类型。应用主窗口会在任务管理界面中被显示。
  • 应用辅助窗口
应用辅助窗口是基于应用手动创建的,用于显示应用的弹窗、悬浮窗口等内容的窗口。应用辅助窗口不会在任务管理界面中被显示。在应用获取权限后,允许应用辅助窗口在应用主窗口不再显示后继续在前台悬浮显示

3. OpenHarmony应用窗口模式

应用窗口模式指的是应用主窗口的显示方式,这也是大部分用户所理解的“多窗口能力”。OpenHarmony 3.1 Release 中,支持以下三种应用窗口模式:全屏、分屏、自由窗口
  • 全屏模式
全屏窗口是手持设备和嵌入设备中常用的窗口模式,OpenHarmony 中的全屏模式具有以下特征:
1. 全屏窗口默认情况下铺满状态栏导航栏之外的整个屏幕区域(见沉浸式章节)
2. 同一时间内,每个屏幕上仅存在一个活动状态的全屏窗口,新的全屏窗口被启动,旧的全屏窗口默认被切换到后台(而不是被遮挡)

  • 分屏模式
分屏模式主要在平板和个人电脑中使用,OpenHarmony 中的分屏模式具有以下特征:
1. 分屏窗口默认占据屏幕的某个部分,OpenHarmony 3.1 Release 中,支持二分屏能力;
2. 两个应用分屏窗口具有分界线,用户可以通过拖拽分界线同时调整两个部分的窗口尺寸。

  • 自由窗口模式
自由窗口是个人办公设备的标志性多窗口形态,OpenHarmony 中的自由窗口模式具有以下特征:
1. 自由窗口的大小和位置可自由改变;
2. 同一个屏幕上可以同时显示多个自由窗口,它们按照打开顺序或者获取焦点的顺序在 Z 轴排布;
3. 自由窗口被点击或触摸将导致自由窗口的 Z 轴高度提升,并获取焦点。

4. OpenHarmony沉浸式能力

沉浸式能力,指的是对状态栏、导航栏等系统窗口进行控制,从而使用户获得佳设备使用体验的能力。状态栏和导航栏是独立的窗口,它们由特定的系统应用(通常是 System UI)进行添加,状态栏和导航栏所承载的内容和功能不在窗口系统中展开,这里仅表述该窗口与应用的窗口相关的行为。
在默认情况下,全屏应用和分屏应用使用的屏幕区域为除去状态栏导航栏外的可用区域。为了让应用能尽量使用屏幕的显示区域,应用可以通过沉浸式接口将状态栏导航栏隐藏,即占据全屏大小的应用的窗口大小与屏幕大小一致,分屏的应用的窗口大小则按比例分割屏幕大小。这在进行全屏播放视频等场景时是非常常用的。
除了隐藏状态栏、导航栏外,还可以将应用的布局设置到状态栏导航栏的下方,这样应用就可以作为半透明状态栏导航栏的背景存在,使用户获得更好的体验。
应用也可以独立设置(https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-window.md#setsystembarproperties)状态栏导航栏的文字颜色和背景颜色,这样就可以使得应用显示时系统整体的界面风格统一。
以上是对OpenHarmony窗口管理框架的简单介绍。OpenHarmony 窗口管理框架和多窗口能力还在不断持续的开发演进中。对 OpenHarmony 窗口框架感兴趣的小伙伴,可以从以下链接获取窗口管理代码进行深入了解:https://gitee.com/openharmony/windowmanager。也希望更多开发者一起加入进来,与OpenHarmony共同成长。
有兴趣进行 OpenHarmony 应用开发的小伙伴,也可以通过以下链接了解 OpenHarmony 的窗口管理相关接口:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-window.md

分享好友

分享这个小栈给你的朋友们,一起进步吧。

OpenHarmony开发者社区
创建时间:2021-12-16 10:45:42
OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • OpenHarmony开发者社区
    栈主

小栈成员

查看更多
  • HarmonyOS开发者社区
  • 飘絮絮絮丶
  • wojiuzhuai
  • Maxlychee
戳我,来吐槽~