探索鸿蒙沉浸式:打造无界交互体验

一、鸿蒙沉浸式简介

在鸿蒙系统中,沉浸式是一种极具特色的设计理念,它致力于让用户在使用应用时能够全身心投入到内容本身,而尽可能减少被系统界面元素的干扰。通常来说,就是将应用的内容区巧妙地延伸到状态栏和导航栏所在的界面区域 ,从而达成一种浑然一体的视觉体验。

从用户体验的角度来看,沉浸式设计带来了诸多显著的提升。一方面,它能使页面与状态栏、导航栏的色调完美统一,避免出现色彩上的突兀感,进而为用户营造出更为和谐、舒适的视觉感受。就好比我们在使用视频播放应用时,开启沉浸式后,视频画面能够无缝衔接至屏幕边缘,整个屏幕都被视频内容所填满,让我们仿佛置身于一个专属的私人影院之中,极大地增强了观看的沉浸感和代入感。另一方面,这种设计还最大程度地利用了屏幕的可视区域,为页面提供了更广阔的布局空间,使得应用能够展示更多的内容,或者以更合理的方式组织界面元素。例如在阅读类应用中,沉浸式模式下文字能够铺满整个屏幕,减少了页面的留白,让我们可以专注于阅读,享受沉浸式的阅读乐趣,尽情沉浸在知识的海洋里,不受外界因素的打扰。

正是由于沉浸式设计在提升用户体验方面有着如此重要的作用,所以深入了解并掌握其在鸿蒙系统中的实现方法就显得尤为关键。接下来,我将详细介绍在鸿蒙系统中实现沉浸式效果的多种实用方法。

二、实现方式

(一)Window.setWindowLayoutFullScreen 方法

使用Window.setWindowLayoutFullScreen方法实现沉浸式效果,主要步骤如下:

  1. 获取应用主窗口:在UIAbility的onWindowStageCreate生命周期方法中,通过windowStage.getMainWindow()方法来获取应用的主窗口。这个方法返回一个Promise对象,我们可以使用then方法来处理获取成功后的逻辑。
  1. 设置窗口为全屏模式:在成功获取主窗口后,调用主窗口对象的setWindowLayoutFullScreen(true)方法,将窗口的布局设置为全屏模式,从而实现沉浸式效果。如果设置过程中出现错误,catch方法会捕获到错误信息并进行相应处理。
  1. 加载目标页面:完成上述步骤后,通过windowStage.loadContent("pages/Index", (err) => {... })方法为窗口加载对应的目标页面。如果加载过程中出现错误,会在回调函数中进行错误处理,打印错误信息;若加载成功,则打印成功信息。

以下是完整的代码示例:

TypeScript 复制代码
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    // 1.获取应用主窗口
    let windowClass: window.Window | undefined = undefined;
    windowStage.getMainWindow().then(windowClass => {
      console.info('Succeeded in obtaining the main window. Data: ' + JSON.stringify(windowClass));
      // 2.设置窗口全屏,实现沉浸式效果
      windowClass.setWindowLayoutFullScreen(true).then(() => {
        console.info('Succeeded in setting the window layout to full - screen mode.');
      }).catch((e: BusinessError) => {
        console.error('Failed to set the window layout to full - screen mode. Cause:' + JSON.stringify(e));
      });
    }).catch((err: BusinessError) => {
      console.error('Failed to obtain the main window. Cause: ' + JSON.stringify(err));
    });
    // 3.为沉浸式窗口加载对应的目标页面
    windowStage.loadContent("pages/Index", (err) => {
      if (err.code) {
        console.error('Failed to load the content. Cause:' + JSON.stringify(err));
        return;
      }
      console.info('Succeeded in loading the content.');
    });
  }
}

这种方式实现的沉浸式效果是全局性的,即应用的所有页面都会处于沉浸式状态。如果某些页面不需要沉浸式效果,还需要在这些页面中通过获取window来关闭沉浸式,例如在aboutToAppear生命周期方法中使用window.getLastWindow(getContext()).then(win => { win.setWindowLayoutFullScreen(false) })来关闭当前页面的沉浸式效果 。

(二)expandSafeArea 属性

expandSafeArea属性是通过扩展组件的安全区域到状态栏和导航栏,从而实现沉浸式效果。其原理是在布局阶段,按照安全区范围大小进行 UI 元素布局;布局完成后,查看设置了expandSafeArea的组件边界(不包括margin)是否和安全区边界相交。如果相交,则根据expandSafeArea传递的属性进一步扩大组件绘制区域大小,覆盖状态栏、导航条这些非安全区域。这个过程仅改变组件自身绘制大小,不进行二次布局,也不影响子节点和兄弟节点的大小和位置。

expandSafeArea属性接受两个参数:

  • 第一个参数types是一个Array<SafeAreaType>类型,用于配置扩展安全区域的类型,默认值为[SafeAreaType.SYSTEM, SafeAreaType.CUTOUT, SafeAreaType.KEYBOARD]。其中,SafeAreaType.SYSTEM表示系统区域(如状态栏、导航栏);SafeAreaType.CUTOUT表示挖孔区域(在未添加相关配置项时,该类型可能不生效);SafeAreaType.KEYBOARD表示键盘区域。
  • 第二个参数edges是一个Array<SafeAreaEdge>类型,用于配置扩展安全区域的方向,默认值为[SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM, SafeAreaEdge.START, SafeAreaEdge.END] 。SafeAreaEdge.TOP表示顶部;SafeAreaEdge.BOTTOM表示底部;SafeAreaEdge.START表示起始边(对于从左到右的语言,通常是左边;对于从右到左的语言,通常是右边);SafeAreaEdge.END表示结束边(与START相反)。

以下是使用expandSafeArea属性实现沉浸式效果的示例代码:

TypeScript 复制代码
@Entry
@Component
struct Example {
  build() {
    Column() {
      Row() {
        Text('Top Row')
         .fontSize(40)
         .textAlign(TextAlign.Center)
         .width('100%')
      }
     .backgroundColor('#F08080')
      // 设置顶部绘制延伸到状态栏
     .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])
      Row() {
        Text('ROW2')
         .fontSize(40)
      }
     .backgroundColor(Color.Orange)
     .padding(20)
      Row() {
        Text('ROW3')
         .fontSize(40)
      }
     .backgroundColor(Color.Orange)
     .padding(20)
      Row() {
        Text('ROW4')
         .fontSize(40)
      }
     .backgroundColor(Color.Orange)
     .padding(20)
      Row() {
        Text('ROW5')
         .fontSize(40)
      }
     .backgroundColor(Color.Orange)
     .padding(20)
      Row() {
        Text('Bottom Row')
         .fontSize(40)
         .textAlign(TextAlign.Center)
         .width('100%')
      }
     .backgroundColor(Color.Orange)
      // 设置底部绘制延伸到导航条
     .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])
    }
   .width('100%')
   .height('100%')
   .alignItems(HorizontalAlign.Center)
   .backgroundColor('#008000')
   .justifyContent(FlexAlign.SpaceBetween)
  }
}

在上述示例中,通过为顶部和底部的Row组件分别设置expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])和expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]),使得顶部组件的绘制区域延伸到状态栏,底部组件的绘制区域延伸到导航条,从而实现了沉浸式效果。需要注意的是,当父容器是滚动容器(如Scroll)时,设置expandSafeArea属性可能不生效;并且设置该属性时,组件不能设置固定宽高尺寸(百分比除外) 。此外,使用expandSafeArea属性是按需设置的,只会对当前设置的组件生效,不会影响其他组件和页面。

三、应用案例分析

(一)阿维塔 11 鸿蒙座舱

阿维塔 11 鸿蒙座舱在多个场景中充分展现了鸿蒙沉浸式技术的魅力。在导航场景下,Petal Maps 为用户带来了前所未有的体验。它不仅实现了多个地图整合覆盖,让用户在选择路线时可享受地图应用间的无感切换 ,还提供 "人驾路线" 和 "智驾路线"。当用户在行车前选择 "智驾路线",车辆开启智驾领航时,导航地图能自行切换为 "智驾地图",无需手动操作,让用户能专注于驾驶正前方,减少操作分心,仿佛整个驾驶过程都有一位贴心的导航助手相伴,沉浸在安全、便捷的驾驶体验中。

音乐场景中,阿维塔 11 鸿蒙座舱延续了 HarmonyOS 在移动终端上的极致性能和流畅体验,采用智能后台管控和内存分配 VIP 调度方案,实现操作跟手性、界面的切换顺滑。用户在切换音乐、调节音量等操作时,感受不到丝毫卡顿,就如同置身于一个专属的音乐空间,尽情享受音乐带来的愉悦。而且,当用户在导航时打开音乐应用,导航界面会自动左移分屏,让用户更快捷地听歌选曲,实现了多任务的高效协同,提升了用户体验的沉浸感。

视频场景同样出色,全屏画面为用户提供了沉浸式的观影体验。底部常驻工具栏在视频场景下会自动隐藏,确保画面的沉浸感,让用户仿佛置身于电影院中。此外,新增的手机投屏功能,支持镜像模式、电脑模式、隐私模式三种投屏模式,用户可以将手机上的视频内容投屏到车机上,享受更大屏幕的观影盛宴,进一步增强了沉浸感 。

(二)其他应用场景案例

在游戏场景中,基于 HarmonyOS NEXT 方舟图形引擎能力,华为技术团队针对重载游戏场景进行了专门优化。以《苍翼:混沌效应》为例,启动速度提升 52%,借助端云编译技术,让玩家无需漫长等待,快速进入游戏世界。同时,基于鸿蒙视窗系统超分算法进行超采样、端云二进制优化,显著提升了设备的能效和温控表现,还原游戏内华丽的动作、特效表演,带给玩家流畅丝滑的游戏体验,使其全身心沉浸在紧张刺激的游戏对战中 。

视频播放应用充分利用了鸿蒙沉浸式技术,当用户播放视频时,通过设置沉浸式效果,视频画面能够延伸至整个屏幕,状态栏和导航栏被巧妙隐藏,避免了对视频内容的干扰。用户仿佛被视频内容完全包围,无论是观看电影、电视剧还是短视频,都能获得更加身临其境的感受,沉浸在精彩的视频情节中。

阅读应用也借助鸿蒙沉浸式技术为用户打造了优质的阅读环境。例如华为阅读升级了 "一镜到底" 阅读模式,用户打开精品书书籍时,能看到不同的 "微动效",系统会依据所选书籍自动匹配合适的主题字体,还根据不同设备的尺寸为精品书籍设计不同的排版,视频动态、精美插图也能内置到书籍之中。这些设计让用户在阅读时仿佛置身于书籍所描绘的世界中,沉浸在知识的海洋里,享受纯粹的阅读乐趣。

四、适配与优化

(一)处理避让区域和页面内容的适配问题

在实现应用页面沉浸式效果后,由于避让区本身展示着电量、时间等系统信息,或者存在如导航条点击、上滑等手势交互,所以常常会与应用页面产生 UI 元素的遮挡、视觉违和或交互冲突等问题 。针对这些不同场景,开发者可以采取以下几种有效的适配方式:

  • 设置系统栏显隐:使用Window.setWindowSystemBarEnable()方法或Window.setSpecificSystemBarEnabled()方法来设置状态栏和导航栏的显隐。例如在视频播放应用中,当进入全屏播放时,通过windowClass.setSpecificSystemBarEnabled('status', false)和windowClass.setSpecificSystemBarEnabled('navigationIndicator', false)将状态栏和导航栏隐藏,避免其对视频画面的遮挡,让用户能够专注于视频内容;而当退出全屏时,再将它们显示出来,方便用户进行其他操作 。
  • 设置系统栏样式:利用Window.setWindowSystemBarProperties()方法可以设置状态栏和导航栏的样式。比如可以将状态栏的背景色设置为透明,内容颜色根据应用背景色进行调整,使状态栏与应用界面在视觉上更加融合。如在一个浅色背景的阅读应用中,将状态栏的背景色设置为透明statusBarColor: "#00ffffff",内容颜色设置为黑色statusBarContentColor: "#000000",这样既能保证用户能看到状态栏的信息,又不会破坏应用整体的视觉协调性 。
  • 获取避让区域高度实现内容避让:调用Window.getWindowAvoidArea()方法能够获取避让区域的高度,然后根据这个高度设置应用页面内容的上下padding,从而实现对状态栏和导航栏的避让。例如在一个聊天应用中,获取到导航栏的高度后,给聊天输入框所在的容器底部设置相应高度的padding,防止输入框被导航栏遮挡,确保用户在输入消息时能够正常看到输入内容 。
  • 获取挖孔区域信息实现挖孔区避让:通过Display.getCutoutInfo()方法可以获取挖孔区域的宽高和位置信息,然后设置对应避让元素的margin来实现挖孔区的避让。在一些游戏应用中,为了避免游戏中的关键元素(如生命值显示、技能按钮等)被挖孔区域遮挡,根据获取到的挖孔区域信息,给这些元素设置合适的margin,保证游戏界面的完整性和操作的便捷性 。

(二)不同设备和屏幕尺寸的适配要点

在不同设备上实现沉浸式效果时,确保布局和样式的一致性是非常重要的。由于鸿蒙系统应用需要适配手机、平板、智能穿戴设备、智慧屏等多种终端设备,这些设备的屏幕尺寸、分辨率和屏幕比例各不相同,所以在开发过程中需要注意以下几点:

  • 使用弹性布局:采用弹性布局(如 Flex 布局)能够使界面元素根据屏幕大小自动调整位置和大小。在一个新闻应用中,使用 Flex 布局来排列新闻列表项,无论在手机的小屏幕还是平板的大屏幕上,新闻标题、图片和摘要等元素都能合理分布,保持良好的视觉效果。同时,避免使用固定像素值来设置元素的大小和位置,尽量使用百分比、vh(视口高度)、vw(视口宽度)等相对单位,以确保界面在不同屏幕尺寸下都能自适应 。
  • 媒体查询:利用媒体查询(Media Query)可以根据设备的屏幕尺寸、分辨率等条件来应用不同的样式。比如当检测到设备是平板时,增大字体大小和元素间距,以适应大屏幕的显示;当检测到是手机时,采用更紧凑的布局,充分利用有限的屏幕空间。在一个电商应用中,通过媒体查询,在手机上展示商品列表时采用单列布局,而在平板上则采用双列布局,提高页面的信息展示效率 。
  • 图片适配:针对不同设备的屏幕分辨率,提供不同分辨率的图片资源。使用image组件时,可以通过srcset属性指定多个不同分辨率的图片路径,让系统根据设备屏幕的实际情况选择最合适的图片进行加载。在一个旅游应用中,展示风景图片时,为高清屏幕的手机提供高分辨率的图片,在普通屏幕设备上则加载低分辨率图片,既能保证图片的清晰度,又能减少数据流量的消耗和加载时间 。
  • 测试与优化:在各种不同类型和尺寸的设备上进行充分的测试,检查沉浸式效果的实现情况以及布局和样式的显示效果。通过测试发现并解决可能出现的问题,如元素错位、文字截断、颜色显示异常等,不断优化应用的适配性,为用户提供一致且优质的体验 。

五、未来展望

随着技术的不断发展和创新,鸿蒙沉浸式技术拥有着广阔的发展前景和巨大的潜力,有望在更多领域得到深度应用和拓展。

在智能汽车领域,鸿蒙沉浸式技术将进一步提升人车交互体验。未来的汽车座舱不仅仅是一个驾驶空间,更将成为一个智能生活的移动枢纽。通过与手机、智能家居等设备的无缝互联,实现多设备之间的信息共享和协同工作。例如,当用户从家中出发前往汽车时,手机上的导航信息可以自动同步到车机上,无需手动输入目的地;在驾驶过程中,用户可以通过语音指令控制家中的智能设备,如提前打开空调、关闭灯光等,真正实现 "人车家" 全场景互联,让用户在驾驶过程中享受到更加便捷、智能、沉浸式的体验。

在智能穿戴设备方面,鸿蒙沉浸式技术将为用户带来更加个性化、便捷的健康管理和运动监测体验。智能手表、手环等设备可以实时监测用户的心率、睡眠、运动步数等健康数据,并通过沉浸式的界面设计和交互方式,将这些数据以直观、易懂的方式呈现给用户。同时,结合人工智能技术,为用户提供个性化的健康建议和运动计划。例如,当用户在运动时,智能手表可以实时显示运动数据,并根据用户的运动状态和目标,提供实时的运动指导和建议,让用户仿佛拥有一个私人健身教练陪伴在身边。

在教育领域,鸿蒙沉浸式技术将助力打造更加生动、高效的学习环境。通过虚拟现实(VR)、增强现实(AR)等技术与教育内容的深度融合,为学生提供沉浸式的学习体验。例如,在历史、地理等学科的学习中,学生可以通过 VR 设备身临其境地感受历史事件的发生场景,或者探索世界各地的地理风貌,增强学习的趣味性和互动性;在实验教学中,AR 技术可以将虚拟实验设备与现实场景相结合,让学生在安全、便捷的环境下进行实验操作,提高学习效果。

在工业制造领域,鸿蒙沉浸式技术也将发挥重要作用。工程师可以通过智能终端设备,利用沉浸式界面实时监控和管理生产线上的设备运行状态、生产进度等信息。同时,借助虚拟现实技术,对产品设计、工艺流程进行虚拟仿真和优化,提前发现问题并解决,提高生产效率和产品质量。例如,在汽车制造过程中,工程师可以通过 VR 设备对汽车的设计方案进行沉浸式的评估和修改,确保设计的合理性和可行性;在生产线上,工人可以通过 AR 眼镜获取实时的操作指导和提示,提高工作效率和准确性。

鸿蒙沉浸式技术未来还可能在金融、医疗、旅游等众多领域得到广泛应用,为各行业的发展带来新的机遇和变革。它将不断拓展人们与数字世界交互的边界,为用户创造更加智能、便捷、沉浸式的生活和工作体验,推动整个社会向智能化、数字化方向加速迈进 。让我们共同期待鸿蒙沉浸式技术在未来绽放出更加绚烂的光彩,为我们的生活带来更多的惊喜和可能。

相关推荐
whysqwhw1 小时前
鸿蒙分布式投屏
harmonyos
whysqwhw2 小时前
鸿蒙AVSession Kit
harmonyos
whysqwhw4 小时前
鸿蒙各种生命周期
harmonyos
whysqwhw5 小时前
鸿蒙音频编码
harmonyos
whysqwhw5 小时前
鸿蒙音频解码
harmonyos
whysqwhw5 小时前
鸿蒙视频解码
harmonyos
whysqwhw6 小时前
鸿蒙视频编码
harmonyos
ajassi20006 小时前
开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器
华为·开源·harmonyos
前端世界7 小时前
在鸿蒙应用中快速接入地图功能:从配置到实战案例全解析
华为·harmonyos
江拥羡橙9 小时前
【基础-判断】HarmonyOS提供了基础的应用加固安全能力,包括混淆、加密和代码签名能力
安全·华为·typescript·harmonyos