HarmonyOS 鸿蒙Next PC窗口适配开发实践
HarmonyOS 鸿蒙Next PC窗口适配开发实践
一、应用启动窗口布局适配
场景介绍
应用启动时默认显示启动页,启动页是应用冷启动时显示的页面,作用是支持应用在冷启动时快速响应,优先执行启动动画(点击桌面图标,立即开始执行窗口动画,此时应用还未启动,没有任何内容可以显示,因此需要显示启动页)。当应用在onWindowStageCreate生命周期里调用moveWindowTo、resize等接口进行布局调整时,可能会出现窗口跳变现象,用户体验不好。
功能介绍
应用启动有两种方式:1、点击应用图标启动;2、通过startAbility 启动。
规范标准
应用启动时设置主窗口的位置和大小有多种方式,按照生效优先级由高到低排序为:应用全屏启动 > startAbility中StartOptions指定大小位置 > 应用窗口使能记忆化 > 在 module.json5配置ability大小和位置 > 系统默认层叠规格。
3.1 应用全屏启动方式
该UIAbility对应的module.json5配置文件中abilities标签的supportWindowMode字段仅配置fullscreen选项或配置fullscreen和split但没有floating。
{
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"supportWindowMode": [
"fullscreen"
],
}
]
}
3.2 StartOptions指定大小位置
startAbility里通过StartOptions选项的windowMode参数设置为WINDOW_MODE_FULLSCREEN
this.context.startAbility(want, {
windowMode: AbilityConstant.WindowMode.WINDOW_MODE_FULLSCREEN
});
3.3 窗口记忆
应用可以通过setWindowRectAutoSave()接口开启窗口记忆,窗口记忆规则如下:
3.4 module.json5 配置ability大小和位置
配置应用启动时最大化,在module.json5的metadata属性字段添加配置ohos.ability.window.isMaximize,且满足supportWindowMode字段配置包含fullscreen选项。
{
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"metadata": [
{
"name": "ohos.ability.window.isMaximize",
"value": "true",
},
]
},
]
}
3.5 窗口层叠规则
默认窗口大小:
序号 | 规格名称 | 规格描述 |
---|---|---|
1 | 窗口默认大小 | 应用首次启动窗口默认大小,宽高各占屏幕尺寸的67%,在工作区(去除Dock和状态栏的屏幕区域)居中显示 |
2 | 系统尺寸限制 | 自由窗口的系统默认最小宽度为320VP,最小高度为72VP,最大宽度和高度都为1920VP;应用未设置windowLimits时,通过window.getWindowLimits接口会默认返回前面系统的尺寸限制 |
3 | 默认窗口模式 | 支持floating模式的窗口,默认以自由窗口方式打开 |
层叠规则
1、找到除了置顶窗口外的最上层窗口(包括后台窗口),作为基准,进行层叠显示(分别向右和向下偏移37vp); 2、如果偏移后的窗口位置有部分超出了工作区,则将超出方向的坐标位置修改为工作区的起点位置; 3、支持多实例的应用,打开第二个窗口时,参考上一个多实例窗口的位置进行层叠。
二、应用窗口缩放适配
窗口大小改变有两种方式:1、通过窗口热区拖拽进行窗口缩放;2、通过resize接口对修改窗口大小。禁止窗口拖拽缩放有两种方式:1、setWindowLimits限制窗口大小;2、setResizeByDragEnabled禁止/启用主窗口和带装饰栏的子窗进行拖拽。主窗口和带标题栏的子窗口默认可以通过热区拖拽进行窗口大小缩放,不带标题栏的子窗口和悬浮窗不可以通过热区拖拽进行窗口大小缩放。
三、应用窗口拖拽移动适配
自绘制标题栏的应用窗口,实现窗口拖拽移动功能,很多应用根据拖拽移动时鼠标的位置,使用moveWindowTo来进行窗口移动,但会导致不跟手的问题,体验不好。并且该接口在扩展屏场景下不支持跨屏移动。API14以后建议通过startMoving实现跟随鼠标移动,实现和原生标题栏一样丝滑的拖拽移动体验,鼠标抬起时自动停止移动,在PC上推荐使用该接口进行拖拽移动,应用可以自定义拖拽区域,并且扩展屏场景下也有较好体验。支持使用stopMoving来停止窗口移动。
四、窗口布局适配
应用布局可以通过自适应布局和响应式布局来更新自身布局,避免出现截断、挤压、堆叠等现象。
五、窗口深浅色模式适配
当前系统存在深浅色两种显示模式,为了给用户更好的使用体验,应用需要适配深浅色模式。
参考链接:应用深浅色适配。
六、系统标题栏三键适配
场景介绍
1.1 应用存在自定义三键的诉求
使用自定义三键的应用,需要接口支持隐藏系统三键的能力;
1.2 使用系统三键的应用,存在控制系统三键样式的诉求
对于使用系统三键的应用,当窗口背景为深色时,为了清晰显示三键,应用需要接口支持控制三键深浅色模式的能力,使得三键的深浅色模式不跟随系统变化;
1.3 三键区域避让的诉求
在隐藏标题栏情况下,应用窗口自绘制标题栏区域自绘制控件,可能会与右侧系统三键的布局重叠,因此需要监听三键的区域变化
功能介绍
2.1 隐藏系统三键
通过接口setWindowTitleButtonVisible控制最大化、最小化、关闭按钮的显示与隐藏
2.2 控制系统三键样式
通过接口setDecorButtonStyle参数DecorButtonStyle的buttonBackgroundSize、spacingBetweenButtons、closeButtonRightMargin字段分别控制按钮高亮显示时的大小、按钮间距、关闭按钮右侧距窗口边距;
规范标准
3.1 自定义三键的应用需要满足下列标准
需要使用如下提供的三键资源开发窗口自定义三键:三键图标.zip
3.2 使用系统三键的应用,通过接口控制装饰栏三键样式时,需要满足如下标准
七、子窗口概念及适配指导
1、窗口类型及权限
类型:WINDOW_TYPE_APP_SUB_WINDOW
2、涉及API列表
编号 | 接口 | 描述 | 使用限制 |
---|---|---|---|
1 | window.createWindow | 创建子窗口或者系统窗口。支持在FA模型下置顶类型为TYPE_APP,创建应用子窗口 | 只支持FA模型 |
2 | windowStage.createSubWindow | 创建该WindowStage实例下的子窗口 | |
3 | windowStage.createSubWindowWithOptions | 创建该WindowStage实例下的子窗口 | 可以指定子窗口的模态属性、置顶模态属性 |
4 | window.createSubWindowWithOptions | 创建该window实例下的子窗口 | 可以指定子窗口的模态属性、置顶模态属性 |
八、悬浮窗适配指导
1. 概念
悬浮窗口是一种特殊的应用窗口,窗口类型为WindowType.TYPE_FLOAT。其可以在已有的任务基础上,创建一个始终在前台显示的窗口。同时悬浮窗口具备在应用主窗口和对应Ability退至后台后,仍然可以在前台显示的能力。通常悬浮窗位于所有应用窗口之上,开发者可以创建悬浮窗,并对悬浮窗进行属性设置等操作。
2. 功能介绍
2.1 创建悬浮窗
创建悬浮窗类型的窗口,加载显示悬浮窗的具体内容。
2.2 对悬浮窗进行属性设置
悬浮窗窗口创建成功后,可以改变其大小、位置等,还可以根据应用需要设置悬浮窗的圆角和阴影等属性。
3、规范标准
3.1 创建即悬浮窗类型的窗口,需要申请ohos.permission.SYSTEM_FLOAT_WINDOW权限,该权限为受控开放权限,仅符合指定场景的在2in1设备上的应用可申请该权限。
4、效果示例
4.1 创建和销毁悬浮窗
4.2 对悬浮窗进行属性设置
4.3 后台应用拉起悬浮窗
4.4 悬浮窗启动主窗
5、适配文档
5.1 配置权限
在main/module.json5里配置的requestPermissions的权限列表中添加SYSTEM_FLOAT_WINDOW权限
5.2 创建悬浮窗
5.3 对悬浮窗进行属性设置
5.4 后台应用拉起悬浮窗
5.5 移动悬浮窗
5.6 悬浮窗启动主窗
5.7 销毁悬浮窗
九、Hopper场景适配指导 - 监听设备状态变化与屏幕可用区域变化
1. 概念
Hopper机器比较特殊,区别于一般的折叠机,Hopper机器有悬停态、展开横屏、展开竖屏三种形态。应用可以监听设备状态变化与屏幕可用区域变化,动态调整窗口的位置大小等属性,并做一些特殊设计,避免一成不变,导致出现问题。
2. 功能介绍
2.1 获取屏幕对象
display对象中包含屏幕宽高,屏幕可用区域宽高等重要信息。
2.2 设备变化监听
显示设备变化的监听。
2.3 获取设备折叠状态
获取可折叠设备的当前折叠状态。
2.4 获取可用区域或折痕区
获取设备屏幕可用区域。
更多关于HarmonyOS 鸿蒙Next PC窗口适配开发实践的实战教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙Next PC窗口适配开发主要使用ArkUI框架的窗口管理能力。开发者需调用Window模块的create/destroy接口管理窗口生命周期,通过WindowStageConfig配置窗口属性。多窗口场景需处理onWindowStageCreate/onWindowStageDestroy回调。窗口尺寸变化监听使用onWindowStageSizeChange事件,布局响应式设计采用栅格系统和百分比布局。窗口模式切换通过WindowMode枚举实现全屏/分屏等效果。窗口间通信使用EventHub或Ability上下文。
更多关于HarmonyOS 鸿蒙Next PC窗口适配开发实践的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对HarmonyOS Next PC窗口适配开发实践的问题,以下是专业回答:
- 应用启动窗口布局适配:
- 启动页跳变问题可通过在module.json5配置ability大小位置或使用setWindowRectAutoSave()开启窗口记忆解决
- 全屏启动优先级最高,可通过module.json5配置supportWindowMode或StartOptions设置
- 窗口缩放适配:
- 通过setWindowLimits限制窗口大小范围
- setResizeByDragEnabled控制是否允许拖拽缩放
- 带装饰栏子窗默认可缩放,无装饰栏需手动启用
- 窗口拖拽移动:
- 推荐使用startMoving实现跟手移动
- moveWindowTo适用于设置固定位置
- 扩展屏场景startMoving体验更好
- 标题栏适配:
- setWindowTitleButtonVisible隐藏系统三键
- setDecorButtonStyle自定义三键样式
- 需监听windowTitleButtonRectChange避免布局重叠
- 子窗口开发:
- 支持多级子窗(最多10级)
- 可通过createSubWindowWithOptions创建模态窗口
- 子窗层级始终在主窗之上
- 悬浮窗开发:
- 需要SYSTEM_FLOAT_WINDOW权限
- 通过createWindow创建TYPE_FLOAT类型窗口
- 可设置圆角、阴影等属性
- Hopper设备适配:
- 监听display.on(‘change’)获取设备状态
- getFoldStatus获取折叠状态
- getAvailableArea获取可用区域
建议重点:
- 启动优化使用窗口记忆
- PC端子窗可超出主窗范围
- 拖拽移动使用startMoving
- 深浅色模式需完整适配
- 多屏场景注意窗口位置计算
这些方案可有效提升HarmonyOS Next在PC端的窗口体验。