第六章 窗口管理

news/2025/2/1 19:19:41 标签: harmonyos, 华为, 鸿蒙4.0, ets, 鸿蒙

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. 应用父窗口


http://www.niftyadmin.cn/n/5839531.html

相关文章

第05章 17 Contour 过滤器介绍与例子

vtkContourFilter 是 VTK&#xff08;Visualization Toolkit&#xff09;中的一个关键类&#xff0c;用于从输入数据生成等值线或等值面。它是基于阈值的过滤器&#xff0c;可以从标量字段中提取等值线或等值面。vtkContourFilter 的核心功能是根据用户指定的值生成等值线或等值…

【玩转全栈】--创建一个自己的vue项目

目录 vue介绍 创建vue项目 vue页面介绍 element-plus组件库 启动项目 vue介绍 Vue.js 是一款轻量级、易于上手的前端 JavaScript 框架&#xff0c;旨在简化用户界面的开发。它采用了响应式数据绑定和组件化的设计理念&#xff0c;使得开发者可以通过声明式的方式轻松管理数据和…

前端力扣刷题 | 4:hot100之 子串

560. 和为K的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 法一&#xff1a;暴力法 var subar…

android安卓用Rime

之前 [1] 在 iOS 配置用上自改方案 [2]&#xff0c;现想在安卓也用上。Rime 主页推荐了两个安卓平台支持 rime 的输入法 [3]&#xff1a; 同文 Tongwen Rime Input Method Editor&#xff0c;但在我的 Realme X2 Pro 上似乎有 bug&#xff1a;弹出的虚拟键盘只有几个 switcher…

2.1.2 Bayer阵列与去马赛克

文章目录 Bayer阵列去马赛克方法 Bayer阵列 由于传感器只能感受到光的强度&#xff0c;而无法感知颜色&#xff0c;所以需要用红、绿、蓝颜色的滤光片将光中的R、G、B亮度滤出&#xff0c;再通过R、G、B的组合得到各种色彩。Bayer阵列是使用一个传感器获得彩色图像的方法&#…

讯飞星火大模型API使用Python调用

本文仅仅为简单API调用&#xff0c;更多复杂使用方法请参见接口文档 先在科大讯飞开放平台注册账号&#xff0c;点击控制台&#xff0c;在我的应用中创建新应用&#xff0c;新应用的名称可以自定义&#xff0c;这里我写的是ai对话&#xff1a; 在这里我们使用的模型为Speak Ul…

deepseek+vscode自动化测试脚本生成

近几日Deepseek大火,我这里也尝试了一下,确实很强。而目前vscode的AI toolkit插件也已经集成了deepseek R1,这里就介绍下在vscode中利用deepseek帮助我们完成自动化测试脚本的实践分享 安装AI ToolKit并启用Deepseek 微软官方提供了一个针对AI辅助的插件,也就是 AI Toolk…

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中&#xff0c;所有事件都继承自 QEvent &#xff0c;并且每个事件都有特定的标识符&#xff0c;如&#xff1a;Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…