当前位置:   article > 正文

arkts鸿蒙沉浸式界面开发api10+_鸿蒙api10

鸿蒙api10

转发,原文链接在这
zh-cn/third-party-cases/immersion-mode.md · OpenHarmony/docs - Gitee.com

沉浸式界面开发

场景说明

沉浸式界面通常是指全屏显示,即当前画面占据整个屏幕。画面放大的同时,让用户摆脱无关信息的干扰,带给用户沉浸式的体验。常见的场景有:视频播放、游戏等。本例即为大家介绍如何开发沉浸式界面。

效果呈现

本例中的沉浸式界面有三种实现方式,对应效果如下:

方案一:颜色背景铺满方案二:图片背景铺满方案三:背景铺满的同时、状态栏不可见

fullcolor

fullbackground

fullscreen

运行环境

本例基于以下环境开发,开发者也可以基于其他适配的版本进行开发:

  • IDE: DevEco Studio 3.1 Beta2
  • SDK: Ohos_sdk_public 3.2.11.9(API Version 9 Release)

实现思路

如果一个应用想要获得沉浸式的体验,开发者可以通过以下三种方式进行实现:

  • 颜色背景通铺:使应用页面的背景色和状态栏、导航栏的背景色一致。可通过setWindowSystemBarProperties进行设置。
  • 图片背景通铺:将状态栏、导航栏的背景色设置为透明以便呈现应用界面的背景,同时通过 windowClass.on接口获取到状态栏、导航栏的区域信息,进行规避处理,以免状态栏、导航栏的内容遮挡住应用内容。
  • 隐藏导航栏和状态栏:使用setWindowSystemBarEnable设置导航栏和状态栏为隐藏状态。

 说明: 沉浸式的设置最好放在ability的onWindowStageCreate的生命周期里,此时刚好可以获取窗口的信息,放在页面页面生命周期里会出现窗口大小不一致,影响体验。

下文将分别介绍这三种方案的具体开发步骤。

开发步骤

颜色背景通铺

此方案通过调用setWindowSystemBarProperties接口将状态栏和导航栏的背景色设置为跟应用窗口相同的颜色,以达到界面全屏的效果。

具体代码如下:

  1. import window from '@ohos.window';
  2. import common from '@ohos.app.ability.common';
  3. @Entry
  4. @Component
  5. struct Type2 {
  6. @State message: string = 'Hello World'
  7. // 获取UIAbility上下文
  8. context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext
  9. async setSystemBar() {
  10. // 获取当前应用窗口
  11. let windowClass:window.Window = await window.getLastWindow(context)
  12. // 将状态栏和导航栏的背景色设置为跟应用窗口相同的颜色
  13. await windowClass.setWindowSystemBarProperties({
  14. navigationBarColor: "#00FF00",
  15. statusBarColor: "#00FF00",
  16. navigationBarContentColor: "#00FF00",
  17. statusBarContentColor: "#00FF00"
  18. })
  19. }
  20. aboutToAppear() {
  21. this.setSystemBar()
  22. }
  23. build() {
  24. Row() {
  25. Column() {
  26. Text(this.message)
  27. .fontSize(50)
  28. .fontWeight(FontWeight.Bold)
  29. }
  30. .width('100%')
  31. }
  32. .height('100%')
  33. }
  34. }

此方案的优势在于不需要处理应用窗口和状态栏、导航栏窗口的遮挡关系,因为此方案没有使用setWindowLayoutFullScreen 接口设置沉浸式布局,所以三个窗口是平铺的,不会重叠。劣势在于无法将应用的背景图等信息延伸到状态栏、导航栏窗口中。适用于扁平化设计风格的应用。

图片背景通铺

这种方案可以实现图片背景的通铺,同时又能避免状态栏和导航栏的内容跟应用内容相互遮挡,导致显示效果异常。 为了能让应用的有效显示范围避开系统的状态栏和导航栏,以免内容重叠,我们可以通过windowClass.on(type: ‘avoidAreaChange’, callback: Callback<{AvoidAreaType, AvoidArea}>) 获取系统规避区域的大小,并对这一块区域做出相应的规避。 其中回调参数AvoidArea是规避区域,可以通过其获取规避区域的具体范围;AvoidAreaType是规避区域的类型其取值如下,示例中需要规避的状态栏和导航栏属于TYPE_SYSTEM类型。

名称说明
TYPE_SYSTEM0表示系统默认区域。
TYPE_CUTOUT1表示刘海屏区域。
TYPE_SYSTEM_GESTURE9+2表示手势区域。
TYPE_KEYBOARD9+3表示软键盘区域
具体代码如下:

page代码

  1. // index.ets
  2. @Entry
  3. @Component
  4. struct Type3 {
  5. @State message: string = 'Hello World'
  6. @StorageLink("topHeight") topHeight: number = 0
  7. @StorageLink("bottomHeight") bottomHeight: number = 0
  8. build() {
  9. Column() {
  10. // 在界面顶部放置一个Row组件,用于占位
  11. Row() {
  12. }
  13. .width("100%")
  14. // 设置Row组件的高度为状态栏的高度,可避免界面内容与状态栏内容重叠
  15. .height(px2vp(this.topHeight))
  16. Row() {
  17. Text(this.message)
  18. .fontSize(50)
  19. .fontWeight(FontWeight.Bold)
  20. .position({ x: 0, y: 0 })
  21. }
  22. .width("100%")
  23. .flexGrow(1)
  24. // 在界面底部放置一个Row组件,用于占位
  25. Row() {
  26. }
  27. .width("100%")
  28. // 设置Row组件的高度为导航栏的高度,可避免界面内容与导航栏内容重叠
  29. .height(px2vp(this.bottomHeight))
  30. }
  31. .backgroundImage($r("app.media.icon"))
  32. .backgroundImageSize(ImageSize.Cover)
  33. .width("100%")
  34. .height("100%")
  35. }
  36. }

ability代码

  1. // MainAbility.ts
  2. import window from '@ohos.window';
  3. async function enterImmersion(windowClass: window.Window) {
  4. // 获取状态栏和导航栏的高度
  5. windowClass.on("avoidAreaChange", ({ type, area }) => {
  6. if (type == window.AvoidAreaType.TYPE_SYSTEM) {
  7. // 将状态栏和导航栏的高度保存在AppStorage中
  8. AppStorage.SetOrCreate<number>("topHeight", area.topRect.height);
  9. AppStorage.SetOrCreate<number>("bottomHeight", area.bottomRect.height);
  10. }
  11. })
  12. // 设置窗口布局为沉浸式布局
  13. await windowClass.setWindowLayoutFullScreen(true)
  14. await windowClass.setWindowSystemBarEnable(["status", "navigation"])
  15. // 设置状态栏和导航栏的背景为透明
  16. await windowClass.setWindowSystemBarProperties({
  17. navigationBarColor: "#00000000",
  18. statusBarColor: "#00000000",
  19. navigationBarContentColor: "#FF0000",
  20. statusBarContentColor: "#FF0000"
  21. })
  22. }
  23. export default class MainAbility extends Ability {
  24. ...
  25. async onWindowStageCreate(windowStage: window.WindowStage) {
  26. let windowClass:window.Window = await windowStage.getMainWindow()
  27. await enterImmersion(windowClass)
  28. windowStage.loadContent('pages/page5')
  29. }
  30. ...
  31. }

隐藏状态栏、导航栏

隐藏状态栏、导航栏可以达到完全沉浸的效果,使用setWindowSystemBarEnable接口即可实现。

具体代码如下:

  1. import window from '@ohos.window';
  2. import common from '@ohos.app.ability.common';
  3. @Entry
  4. @Component
  5. struct Type3 {
  6. @State message: string = 'Hello World'
  7. context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext
  8. async setSystemBar() {
  9. let windowClass = await window.getLastWindow(context)
  10. //设置导航栏,状态栏不可见
  11. await windowClass.setWindowSystemBarEnable([])
  12. }
  13. aboutToAppear() {
  14. this.setSystemBar()
  15. }
  16. build() {
  17. Row() {
  18. Column() {
  19. Text(this.message)
  20. .fontSize(50)
  21. .fontWeight(FontWeight.Bold)
  22. }
  23. .width('100%')
  24. }
  25. .backgroundColor("#ffee33")
  26. .height('100%')
  27. }
  28. }

  我建了一个鸿蒙开发者交流群,欢迎大家加入交流鸿蒙开发

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/578862
推荐阅读
相关标签
  

闽ICP备14008679号