HarmonyOS通过窗口模块实现在同一块物理屏幕上提供多个应用界面显示和交互。
6.1 窗口开发概述
HarmonyOS通过窗口模块实现窗口管理,包括: 针对应用开发者,提供了界面显示和交互能力。 针对终端用户,提供了控制应用界面的方式。 针对整个操作系统,提供了不同应用界面的组织管理逻辑
6.1.1 应用窗口的分类
应用窗口是指与应用显示相关的窗口。根据显示内容的不同,应用窗口又分为应用主窗口和应用子窗口两种类型。 应用主窗口:应用主窗口用于显示应用界面,会在“任务管理”界面显示。 应用子窗口:应用子窗口用于显示应用的弹窗、悬浮窗等辅助窗口,不会在“任务管理”界面显示。
6.1.2 窗口模块的用途
该模块提供以下窗口相关的常用功能。 Window:当前窗口实例,窗口管理器管理的基本单元。 WindowStage:窗口管理器,用于管理各个基本窗口单元。 应用主在HarmonyOS中,窗口模块的主要职责如下: 提供应用和系统界面的窗口对象。 应用开发者通过窗口加载UI界面,实现界面显示功能。 组织不同窗口的显示关系,即维护不同窗口间的叠加层次和位置属性。 应用和系统的窗口具有多种类型,不同类型的窗口具有不同的默认位置和叠加层次(Z轴高度)。同时,用户操作也可以在一定范围内对窗口的位置和叠加层次进行调整。 提供窗口装饰。窗口装饰指窗口标题栏和窗口边框。 窗口标题栏通常包括窗口最大化、最小化及关闭按钮等界面元素,具有默认的单击行为,方便用户进行操作;窗口边框则方便用户对窗口进行拖曳缩放等行为。窗口装饰是系统的默认行为,开发者可选择启用/禁用,无须关注UI代码层面的实现。 提供窗口动效。 在窗口显示、隐藏及窗口间切换时,窗口模块通常会添加动画效果,以使各个交互过程更加连贯流畅。在HarmonyOS中,应用窗口的动效为默认行为,不需要开发者进行设置或者修改。 指导输入事件分发, 即根据当前窗口的状态或焦点进行事件的分发。触摸和鼠标事件根据窗口的位置和尺寸进行分发,而键盘事件会被分发至焦点窗口。应用开发者可以通过窗口模块提供的接口设置窗口是否可以触摸和是否可以获焦。
6.1.3 窗口沉浸式能力
窗口沉浸式能力是指对状态栏、导航栏等系统窗口进行控制,减少状态栏、导航栏等系统界面的突兀感,从而使用户获得最佳体验的能力。 沉浸式能力只在应用主窗口作为全屏窗口时生效。通常情况下,应用子窗口(弹窗、悬浮窗口等辅助窗口)和处于自由窗口下的应用主窗口无法使用沉浸式能力。
6.2 窗口管理的典型场景
在Stage模型下,管理应用窗口的典型场景有: 设置应用主窗口的属性及目标页面。 设置应用子窗口的属性及目标页面。 体验窗口沉浸式能力。
6.2.1 设置应用主窗口的属性及目标页面
在Stage模型下,应用主窗口由Ability创建并维护生命周期。在Ability的onWindowStageCreate回调中,通过WindowStage获取应用主窗口,即可对其进行属性设置等操作。
常用API如下。 getMainWindow(callback: AsyncCallback<Window>):获取WindowStage实例下的主窗口。 loadContent(path: string, callback: AsyncCallback<void>):为当前WindowStage的主窗口加载具体页面。 setBrightness(brightness: number, callback: AsyncCallback<void>):设置屏幕亮度值。 setTouchable(isTouchable: boolean, callback: AsyncCallback<void>):设置窗口是否为可触状态。
6.2.2 设置应用子窗口的属性及目标页面
开发者可以按需创建应用子窗口,如弹窗等,并对其进行属性设置等操作。
常用API如下: createSubWindow(name: string, callback: AsyncCallback<Window>):创建子窗口。 loadContent(path: string, callback: AsyncCallback<void>):为当前窗口加载具体页面。 show(callback: AsyncCallback<void>):显示当前窗口。
6.2.3 体验窗口沉浸式能力
在看视频、玩游戏等场景下,用户往往希望隐藏状态栏、导航栏等不必要的系统窗口,从而获得更佳的沉浸式体验。此时可以借助窗口沉浸式能力达到预期效果。窗口沉浸式能力都是针对应用主窗口而言的。
实现沉浸式效果有以下两种方式: 调用setFullScreen接口,设置应用主窗口为全屏显示,此时导航栏、状态栏将隐藏,从而达到沉浸式效果。 调用setSystemBarEnable接口,设置导航栏、状态栏不显示,从而达到沉浸式效果。
6.3 实现窗口沉浸式效果
本节演示窗口管理的常用操作,包括应用主窗口的操作以及窗口沉浸式能力的使用。
打开DevEco Studio,选择一个Empty Ability工程模板,创建一个名为ArkTSWindow的工程为演示示例。
6.3.1 修改onWindowStageCreate方法
修改EntryAbility.ets的onWindowStageCreate方法,在windowStage.loadContent方法之前添加如下内容:
//获取应用主窗口
let windowClass = null;
windowStage.getMainWindow((err, data) => {
if (err.code) {
console.error('Failed to obtain the main window. Cause: ' + JSON.stringify(err));
return;
}
windowClass = data;
console.info('Succeeded in obtaining the main window. Data: ' + JSON.stringify(data));
//实现沉浸式效果,设置应用主窗口为全屏显示
let isFullScreen = true;
windowClass.setFullScreen(isFullScreen, (err) => {
if (err) {
console.error('Failed to enable the full-screen mode. Cause:' + JSON.stringify(err));
return;
}
console.info('Succeeded in enabling the full-screen mode.');
});
})
6.4 小结
本章介绍HarmonyOS的窗口管理,内容包括应用主窗口管理、应用子窗口管理以及窗口沉浸式能力的实现。
6.5 习题
1.判断题
(1)窗口沉浸式能力是指对状态栏、导航栏等系统窗口进行控制,减少状态栏、导航栏等系统界面的突兀感,从而使用户获得最佳体验的能力。( )
(2)沉浸式能力只在应用主窗口作为全屏窗口时生效。通常情况下,应用子窗口(弹窗、悬浮窗口等辅助窗口)和处于自由窗口下的应用主窗口无法使用沉浸式能力。( )
2.多选题 应用窗口可分为哪几类?( )
A. 应用主窗口 B. 应用子窗口 C. 应用父窗口