您现在的位置是:首页 > 编程 > 

【HarmonyOS ext】原生沉浸式界面

2025-07-27 01:30:28
【HarmonyOS ext】原生沉浸式界面 背景在实际项目中,为了软件使用整体调看起来统一,一般顶部和底部的颜需要铺满整个手机屏幕。因此,这篇帖子是介绍设置的方法,也是应用沉浸式效果。如下图:底部的绿延伸到上面的状态栏和下面的导航栏UI在鸿蒙应用中,全屏UI元素分为状态栏、应用界面和导航栏。一般实现应用沉浸式效果由两种方式:窗口全屏布局方案:调整布局系统为全屏布局,界面元素延伸到状态栏

【HarmonyOS ext】原生沉浸式界面

背景

在实际项目中,为了软件使用整体调看起来统一,一般顶部和底部的颜需要铺满整个手机屏幕。因此,这篇帖子是介绍设置的方法,也是应用沉浸式效果。如下图:底部的绿延伸到上面的状态栏和下面的导航栏

UI

在鸿蒙应用中,全屏UI元素分为状态栏、应用界面和导航栏。

一般实现应用沉浸式效果由两种方式:

  • 窗口全屏布局方案:调整布局系统为全屏布局,界面元素延伸到状态栏和导航条区域实现沉浸式效果。
  • 组件延伸方案:组件布局在应用界面区域,通过接口方法延伸到状态栏和导航栏。

窗口全屏布局方案

  1. 新建展示页面,并使用@StorageProp定义页面内容的顶部偏移和底部偏移属性
代码语言:javascript代码运行次数:0运行复制
@Entry
@Component
struct Index {
  @StorageProp('bottomRectHeight')
  bottomRectHeight: number = 0;
  @StorageProp('topRectHeight')
  topRectHeight: number = 0;

  build() {
    Row() {
      Column() {
        Row() {
          Text('DEMO-ROW1').fontSize(40)
        }.backgroundColor(Color.Orange).padding(20)

        Row() {
          Text('DEMO-ROW2').fontSize(40)
        }.backgroundColor(Color.Orange).padding(20)

        Row() {
          Text('DEMO-ROW').fontSize(40)
        }.backgroundColor(Color.Orange).padding(20)

        Row() {
          Text('DEMO-ROW4').fontSize(40)
        }.backgroundColor(Color.Orange).padding(20)

        Row() {
          Text('DEMO-ROW5').fontSize(40)
        }.backgroundColor(Color.Orange).padding(20)

        Row() {
          Text('DEMO-ROW6').fontSize(40)
        }.backgroundColor(Color.Orange).padding(20)
      }
      .width('100%')
      .height('100%')
      .alignItems(HorizontalAlign.Center)
      .justifyContent(FlexAlign.SpaceBetween)
      .backgroundColor('#008000')
      // top数值与状态栏区域高度保持一致;bottom数值与导航条区域高度保持一致
      .padding({ top: px2vp(), bottom: px2vp(this.bottomRectHeight) })
    }
  }
}
  1. 在EntryAbility的onWindowStageCreate方法中,调用window.Window.setWindowLayoutFullScreen方法设置窗口全屏。
代码语言:javascript代码运行次数:0运行复制
let windowClass: window.Window = windowStage.getMainWindowSync();
let isLayoutFullScreen = true;
    windowClass.setWindowLayoutFullScreen(isLayoutFullScreen).then(() => {
      cole.info('Succeeded in setting the window layout to full-screen mode.');
    }).catch((err: BusinessError) => {
      ('Failed to set the window layout to full-screen mode. Cause:' + JSO.stringify(err));
    });
  1. 为了避免构件被挡住,根据导航条和状态栏的高度,修改bottomRectHeight和topRectHeight的数值。
代码语言:javascript代码运行次数:0运行复制
    //获取导航栏高度
    let bottomRectHeight = windowClass
      .getWindowAvoidArea(window.AvoidAreaType.TYPE_AVIGATIO_IDICATOR)
      .bottomRect
      .height;
    AppStorage.setOrCreate('bottomRectHeight', bottomRectHeight);
    // 获取状态栏区域高度
    let topRectHeight = windowClass
      .getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)
      .topRect
      .height;
    AppStorage.setOrCreate('topRectHeight', topRectHeight);
  1. 再设置页面监听,动态修改bottomRectHeight和topRectHeight的数值。
代码语言:javascript代码运行次数:0运行复制
('avoidAreaChange', (data) => {
      if ( === window.AvoidAreaType.TYPE_SYSTEM) {
        let topRectHeight = data.height;
        AppStorage.setOrCreate('topRectHeight', topRectHeight);
      } else if ( == window.AvoidAreaType.TYPE_AVIGATIO_IDICATOR) {
        let bottomRectHeight = data.area.bottomRect.height;
        AppStorage.setOrCreate('bottomRectHeight', bottomRectHeight);
      }
    });
EntryAbility完整代码

仅需要修改onWindowStageCreate方法

代码语言:javascript代码运行次数:0运行复制
onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err) => {
      if () {
        (0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSO.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
    });
    // 获取应用主窗口
    let windowClass: window.Window = windowStage.getMainWindowSync();
    // 设置窗口全屏
    let isLayoutFullScreen = true;
    windowClass.setWindowLayoutFullScreen(isLayoutFullScreen).then(() => {
      cole.info('Succeeded in setting the window layout to full-screen mode.');
    }).catch((err: BusinessError) => {
      ('Failed to set the window layout to full-screen mode. Cause:' + JSO.stringify(err));
    });
    //获取导航栏高度
    let bottomRectHeight = windowClass
      .getWindowAvoidArea(window.AvoidAreaType.TYPE_AVIGATIO_IDICATOR)
      .bottomRect
      .height;
    AppStorage.setOrCreate('bottomRectHeight', bottomRectHeight);
    // 获取状态栏区域高度
    let topRectHeight = windowClass
      .getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)
      .topRect
      .height;
    AppStorage.setOrCreate('topRectHeight', topRectHeight);

    // 注册监听函数,动态获取避让区域数据
    ('avoidAreaChange', (data) => {
      if ( === window.AvoidAreaType.TYPE_SYSTEM) {
        let topRectHeight = data.height;
        AppStorage.setOrCreate('topRectHeight', topRectHeight);
      } else if ( == window.AvoidAreaType.TYPE_AVIGATIO_IDICATOR) {
        let bottomRectHeight = data.area.bottomRect.height;
        AppStorage.setOrCreate('bottomRectHeight', bottomRectHeight);
      }
    });

  }

组件延伸方案

使用expandSafeArea方法来实现。

代码语言:javascript代码运行次数:0运行复制
expandSafeArea(types?: Array<SafeAreaType>, edges?: Array<SafeAreaEdge>): T;
  • types:配置扩展安全区域的类型。SafeAreaType枚举类型,SYSTEM是系统默认非安全区域,包括状态栏、导航栏;CUTOUT是设备的非安全区域,例如刘海屏或挖孔屏区域;KEYBOARD是软键盘区域,组件不避让键盘。
  • edges:扩展安全区域的方向。
代码

通过颜对比,可以看出组件延伸效果。

  • column:背景颜设置为橘,从图片可以看出只能在安全区域内显示。
  • list:背景颜设置为黄,从图片可以看出已经延伸至导航条和状态栏了。
  • Text:背景颜设置成红,就可以看到整个组件的滑动过程.
代码语言:javascript代码运行次数:0运行复制
@Entry
@Component
struct ExamplePage {
  private arr: number[] = [0, 1, 2, , 4, 5, 6, 7, 8, 9]

  build() {
    Column() {
      List({ space: 20, initialIndex: 0 }) {
        ForEach(this.arr, (item: number) => {
          ListItem() {
            Text('' + item)
              .width('100%')
              .height(100)
              .fontSize(16)
              .textAlign(TextAlign.Center)
              .borderRadius(10)
              .backgroundColor(Color.Red)
          }

        }, (item: number) => ())
      }
      .listDirection(Axis.Vertical) // 排列方向
      .scrollBar(BarState.Off)
      .friction(0.6)
      .divider({
        strokeWidth: 2,
        color: 0xFFFFFF,
        startMargin: 20,
        endMargin: 20
      }) // 每行之间的分界线
      .edgeEffect(EdgeEffect.Spring) // 边缘效果设置为Spring
      .width('90%')
      .backgroundColor(Color.Yellow)
      // List组件的视窗范围扩展至导航条。
      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
    }
    .width('100%')
    .height('100%')
    .backgroundColor(Color.Orange)
  }
}

总结

如果不是全部界面都需要实现沉浸式布局时,可以通过组件延伸方案去实现部分组件的沉浸式布局。

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1224245.html

相关标签:无
上传时间: 2025-07-25 21:29:36
留言与评论(共有 18 条评论)
本站网友 痫病痫病的病因
18分钟前 发表
本站网友 怀孕一个月胎儿图
21分钟前 发表
'testTag'
本站网友 羌活的功效与作用
19分钟前 发表
导航栏;CUTOUT是设备的非安全区域
本站网友 为公司献计献策
9分钟前 发表
topRectHeight);再设置页面监听
本站网友 益华软件
9分钟前 发表
'Ability onWindowStageCreate'); windowStage.loadContent('pages/Index'
本站网友 水烟壶怎么用
20分钟前 发表
为了软件使用整体调看起来统一
本站网友 冻梨
17分钟前 发表
(item
本站网友 虚拟主机评测
8分钟前 发表
bottomRectHeight); // 获取状态栏区域高度 let topRectHeight = windowClass .getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM) .topRect .height; AppStorage.setOrCreate('topRectHeight'
本站网友 李安平
14分钟前 发表
window.Window = windowStage.getMainWindowSync(); // 设置窗口全屏 let isLayoutFullScreen = true; windowClass.setWindowLayoutFullScreen(isLayoutFullScreen).then(() => { cole.info('Succeeded in setting the window layout to full-screen mode.'); }).catch((err
本站网友 高新四小
10分钟前 发表
list:背景颜设置为黄
本站网友 炒股的智慧
5分钟前 发表
代码语言:javascript代码运行次数:0运行复制let windowClass
本站网友 一次性爱上
27分钟前 发表
bottomRectHeight); // 获取状态栏区域高度 let topRectHeight = windowClass .getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM) .topRect .height; AppStorage.setOrCreate('topRectHeight'
本站网友 宝岛眼镜店
13分钟前 发表
startMargin
本站网友 骑车减肥
17分钟前 发表
例如刘海屏或挖孔屏区域;KEYBOARD是软键盘区域
本站网友 鸭形玻璃注
18分钟前 发表
5
本站网友 海城房产网
9分钟前 发表
8
本站网友 张曼
10分钟前 发表
1