HarmonyOS 鸿蒙Next之智慧多窗学习指南
HarmonyOS 鸿蒙Next之智慧多窗
一、概述
智慧多窗是一种多任务处理解决方案,它允许用户在同一时间、同一屏幕上以悬浮窗或分屏的方式同时运行多个应用窗口。在智慧多窗的显示模式下,用户可以根据自己的需求,合理安排应用窗口的位置和大小。
二、触发方法
1、手势触发,全屏时,从屏幕底部向上滑到右上方行程悬浮窗,滑到左上方形成分屏
2、通知中心下拉触发悬浮窗模式
三、使用场景
1、悬浮窗是一种在设备屏幕上悬浮的、非全屏的应用窗口。一般用于在已有全屏任务运行的基础上,临时处理另一个任务,或短时间多任务并行使用。如浏览网页的同时回复消息。
2、分屏一般用于两个应用长时间并行使用的场景。例如边看购物攻略、边浏览商品;边看视频、边玩游戏;看学习类视频的同时做笔记等。
四、适配方案
1、在应用module.json5配置文件中添加声明属性,
supportWindowMode属性增加“floating”字段或使用缺省值以声明应用支持悬浮窗,增加“split”字段或使用缺省值以声明应用支持分屏
2、页面布局适配
1、EntryAbility里的onWindowStageCreate方法里注册窗口尺寸变化事件监听windowSizeChange,其中常量统一定义在BreakpointConstants中
static readonly AppStoreKey_ScreenHeight = "screenHeight";
static readonly AppStoreKey_ScreenWidth = "screenWidth";
windowStage.getMainWindow((err: BusinessError, data: window.Window) => {
if (err.code) {
return;
}
let windowClass: window.Window = data;
try {
// 获取窗口尺寸,存入AppStorage
AppStorage.setOrCreate(BreakpointConstants.AppStoreKey_ScreenWidth, px2vp(windowClass.getWindowProperties().windowRect.width))
AppStorage.setOrCreate(BreakpointConstants.AppStoreKey_ScreenHeight, px2vp(windowClass.getWindowProperties().windowRect.height))
// 监听窗口尺寸变化
windowClass.on('windowSizeChange', (windowSize) => {
AppStorage.setOrCreate(BreakpointConstants.AppStoreKey_ScreenWidth, px2vp(windowSize.width))
AppStorage.setOrCreate(BreakpointConstants.AppStoreKey_ScreenHeight, px2vp(windowSize.height))
})
} catch {
}
});
2、UI侧通过@StorageProp绑定窗口尺寸后,AppStorage中属性key值对应的数据一旦改变,UI侧会同步修改。
@Entry
@Component
struct FirstPage {
@State message: string = 'Hello World';
// 初始化参数
[@StorageProp](/user/StorageProp)(BreakpointConstants.AppStoreKey_ScreenWidth) screenWidth: number = 0;
[@StorageProp](/user/StorageProp)(BreakpointConstants.AppStoreKey_ScreenHeight) screenHeight: number = 0;
build() {
RelativeContainer() {
Text(this.message)
.id('FirstPageHelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
Row() {
Image($r('app.media.add_file'))
.width(50)
.height(50)
.objectFit(ImageFit.ScaleDown)
.onClick(() => {
})
}.size({
width:this.screenWidth,
height:this.screenHeight/3
})
.backgroundColor(Color.Green)
.justifyContent(FlexAlign.Center)
}
.height('100%')
.width('100%')
}
}
3、应用内分屏
应用内分屏功能允许应用在全屏显示模式下,通过调用startAbility方法启动UIAbility并形成分屏。
1、在应用新增分屏调用的EntryAbility1和EntryAbility2
2、在应用中获取UIAbilityContext 对象,这是启动分屏所必需的上下文对象,用于后续调用startAbility接口。
3、调用startAbility接口启动UIAbility,形成分屏。
注:bundleName是应用的app.json里的bundleName,windowMode设置左侧分屏还是右侧分屏,只有在设备横屏情况下生效。
Button() {
Text('启动应用内分屏')
}
.height(40)
.onClick(() => {
let context = getContext(this) as common.UIAbilityContext;
let want: Want = { bundleName: 'com.example.flutter_ohos22', abilityName: 'EntryAbility1', moduleName: '' };
// 创建StartOptions并设置窗口模式为分屏模式,左侧分屏
let option: StartOptions = { windowMode: AbilityConstant.WindowMode.WINDOW_MODE_SPLIT_PRIMARY };
try {
context.startAbility(want, option, (error) => {
if (error.code) {
return;
}
});
} catch (paramError) {
}
})
Button() {
Text('启动另一分屏窗口')
}
.height(40)
.onClick(() => {
let context = getContext(this) as common.UIAbilityContext;
let want: Want = { bundleName: 'com.example.flutter_ohos22', abilityName: 'EntryAbility2', moduleName: '' };
// 指定启动EntryAbility2的窗口模式,右侧分屏
let option: StartOptions = { windowMode: AbilityConstant.WindowMode.WINDOW_MODE_SPLIT_SECONDARY };
context.startAbility(want, option);
})
在平板上的效果如图:
更多关于HarmonyOS 鸿蒙Next之智慧多窗学习指南的实战教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS的智慧多窗功能基于分布式能力实现多任务并行处理,支持应用分屏和悬浮窗两种模式。分屏比例可自由调整,最小触发区域为10dp。通过窗口管理器(WindowManager)接口控制窗口状态,包括z-order管理和窗口属性设置。悬浮窗默认尺寸为400dp*600dp,可自适应不同屏幕密度。该功能使用ArkUI框架实现UI布局,通过Ability调度机制协调多应用协同。窗口生命周期与Page Ability绑定,支持动态创建和销毁。
更多关于HarmonyOS 鸿蒙Next之智慧多窗学习指南的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
关于HarmonyOS Next的智慧多窗功能,您提供的资料已经非常全面。这里补充几点关键信息:
- 窗口模式适配建议:
- 对于分屏模式,建议采用响应式布局设计,确保内容在不同比例下都能良好展示
- 悬浮窗模式下,应考虑最小尺寸限制(建议不小于240vp*240vp)
- 性能优化点:
- 窗口尺寸变化监听回调中避免频繁的UI重绘
- 分屏模式下两个窗口共享系统资源,需注意内存管理
- 特殊场景处理:
- 横竖屏切换时需重新计算布局
- 分屏比例调整时的平滑过渡效果
- 开发注意事项:
- 应用内分屏需要确保多个Ability之间的数据同步机制
- 悬浮窗模式下应正确处理焦点切换事件
您提供的代码示例已经涵盖了主要实现方式,特别是通过AppStorage实现尺寸同步的方案很实用。对于需要更复杂布局的场景,可以考虑使用Grid或RelativeContainer等容器组件。