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

一、鸿蒙沉浸式简介

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

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

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

二、实现方式

(一)Window.setWindowLayoutFullScreen 方法

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

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

以下是完整的代码示例:

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属性实现沉浸式效果的示例代码:

@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 眼镜获取实时的操作指导和提示,提高工作效率和准确性。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值