HarmonyOS 鸿蒙Next之智慧多窗学习指南

HarmonyOS 鸿蒙Next之智慧多窗

一、概述

智慧多窗是一种多任务处理解决方案,它允许用户在同一时间、同一屏幕上以悬浮窗或分屏的方式同时运行多个应用窗口。在智慧多窗的显示模式下,用户可以根据自己的需求,合理安排应用窗口的位置和大小。

二、触发方法

1、手势触发,全屏时,从屏幕底部向上滑到右上方行程悬浮窗,滑到左上方形成分屏 image.png

2、通知中心下拉触发悬浮窗模式

三、使用场景

1、悬浮窗是一种在设备屏幕上悬浮的、非全屏的应用窗口。一般用于在已有全屏任务运行的基础上,临时处理另一个任务,或短时间多任务并行使用。如浏览网页的同时回复消息。

2、分屏一般用于两个应用长时间并行使用的场景。例如边看购物攻略、边浏览商品;边看视频、边玩游戏;看学习类视频的同时做笔记等。

四、适配方案

1、在应用module.json5配置文件中添加声明属性,

supportWindowMode属性增加“floating”字段或使用缺省值以声明应用支持悬浮窗,增加“split”字段或使用缺省值以声明应用支持分屏

image.png

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%')
  }
}


image.png

3、应用内分屏

应用内分屏功能允许应用在全屏显示模式下,通过调用startAbility方法启动UIAbility并形成分屏。

1、在应用新增分屏调用的EntryAbility1和EntryAbility2

image.png

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);
        })

在平板上的效果如图:

image.png


更多关于HarmonyOS 鸿蒙Next之智慧多窗学习指南的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

HarmonyOS的智慧多窗功能基于分布式能力实现多任务并行处理,支持应用分屏和悬浮窗两种模式。分屏比例可自由调整,最小触发区域为10dp。通过窗口管理器(WindowManager)接口控制窗口状态,包括z-order管理和窗口属性设置。悬浮窗默认尺寸为400dp*600dp,可自适应不同屏幕密度。该功能使用ArkUI框架实现UI布局,通过Ability调度机制协调多应用协同。窗口生命周期与Page Ability绑定,支持动态创建和销毁。

更多关于HarmonyOS 鸿蒙Next之智慧多窗学习指南的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


关于HarmonyOS Next的智慧多窗功能,您提供的资料已经非常全面。这里补充几点关键信息:

  1. 窗口模式适配建议:
  • 对于分屏模式,建议采用响应式布局设计,确保内容在不同比例下都能良好展示
  • 悬浮窗模式下,应考虑最小尺寸限制(建议不小于240vp*240vp)
  1. 性能优化点:
  • 窗口尺寸变化监听回调中避免频繁的UI重绘
  • 分屏模式下两个窗口共享系统资源,需注意内存管理
  1. 特殊场景处理:
  • 横竖屏切换时需重新计算布局
  • 分屏比例调整时的平滑过渡效果
  1. 开发注意事项:
  • 应用内分屏需要确保多个Ability之间的数据同步机制
  • 悬浮窗模式下应正确处理焦点切换事件

您提供的代码示例已经涵盖了主要实现方式,特别是通过AppStorage实现尺寸同步的方案很实用。对于需要更复杂布局的场景,可以考虑使用Grid或RelativeContainer等容器组件。

回到顶部