0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony沉浸式界面开发代码教程

OpenHarmony技术社区 来源:OST开源开发者 作者:OST开源开发者 2023-06-06 09:26 次阅读

沉浸式界面通常是指全屏显示,即当前画面占据整个屏幕。画面放大的同时,让用户摆脱无关信息的干扰,带给用户沉浸式的体验。

常见的场景有:视频播放、游戏等。本例即为大家介绍如何开发沉浸式界面。

效果呈现

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

方案一:颜色背景铺满 方案二:图片背景铺满

方案三:背景铺满的同时、状态栏不可见

运行环境

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

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 接口将状态栏和导航栏的背景色设置为跟应用窗口相同的颜色,以达到界面全屏的效果。

具体代码如下:


importwindowfrom'@ohos.window';
importcommonfrom'@ohos.app.ability.common';

@Entry
@Component
structType2{
@Statemessage:string='HelloWorld'
//获取UIAbility上下文
context:common.UIAbilityContext=getContext(this)ascommon.UIAbilityContext
asyncsetSystemBar(){
//获取当前应用窗口
letwindowClass:window.Window=awaitwindow.getLastWindow(context)
//将状态栏和导航栏的背景色设置为跟应用窗口相同的颜色
awaitwindowClass.setWindowSystemBarProperties({
navigationBarColor:"#00FF00",
statusBarColor:"#00FF00",
navigationBarContentColor:"#00FF00",
statusBarContentColor:"#00FF00"
})
}

aboutToAppear(){
this.setSystemBar()
}

build(){
Row(){
Column(){
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
}
.height('100%')
}
}
此方案的优势在于不需要处理应用窗口和状态栏、导航栏窗口的遮挡关系,因为此方案没有使用 setWindowLayoutFullScreen 接口设置沉浸式布局,所以三个窗口是平铺的,不会重叠。劣势在于无法将应用的背景图等信息延伸到状态栏、导航栏窗口中。适用于扁平化设计风格的应用。

②图片背景通铺

这种方案可以实现图片背景的通铺,同时又能避免状态栏和导航栏的内容跟应用内容相互遮挡,导致显示效果异常。

为了能让应用的有效显示范围避开系统的状态栏和导航栏,以免内容重叠,我们可以通过下面代码获取系统规避区域的大小,并对这一块区域做出相应的规避。

windowClass.on(type:‘avoidAreaChange’,callback:Callback<{AvoidAreaType, AvoidArea}>)
其中回调参数 AvoidArea 是规避区域,可以通过其获取规避区域的具体范围;AvoidAreaType 是规避区域的类型其取值如下,示例中需要规避的状态栏和导航栏属于 TYPE_SYSTEM 类型。

4eecce7c-0408-11ee-90ce-dac502259ad0.png

具体代码如下:

page 代码:

//index.ets
@Entry
@Component
structType3{
@Statemessage:string='HelloWorld'
@StorageLink("topHeight")topHeight:number=0
@StorageLink("bottomHeight")bottomHeight:number=0

build(){
Column(){
//在界面顶部放置一个Row组件,用于占位
Row(){

}
.width("100%")
//设置Row组件的高度为状态栏的高度,可避免界面内容与状态栏内容重叠
.height(px2vp(this.topHeight))
Row(){
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.position({x:0,y:0})
}
.width("100%")
.flexGrow(1)
//在界面底部放置一个Row组件,用于占位
Row(){

}
.width("100%")
//设置Row组件的高度为导航栏的高度,可避免界面内容与导航栏内容重叠
.height(px2vp(this.bottomHeight))
}
.backgroundImage($r("app.media.icon"))
.backgroundImageSize(ImageSize.Cover)
.width("100%")
.height("100%")
}
}

ability 代码:

//MainAbility.ts
importwindowfrom'@ohos.window';

asyncfunctionenterImmersion(windowClass:window.Window){
//获取状态栏和导航栏的高度
windowClass.on("avoidAreaChange",({type,area})=>{
if(type==window.AvoidAreaType.TYPE_SYSTEM){
//将状态栏和导航栏的高度保存在AppStorage中
AppStorage.SetOrCreate("topHeight",area.topRect.height);
AppStorage.SetOrCreate("bottomHeight",area.bottomRect.height);
}
})
//设置窗口布局为沉浸式布局
awaitwindowClass.setWindowLayoutFullScreen(true)
awaitwindowClass.setWindowSystemBarEnable(["status","navigation"])
//设置状态栏和导航栏的背景为透明
awaitwindowClass.setWindowSystemBarProperties({
navigationBarColor:"#00000000",
statusBarColor:"#00000000",
navigationBarContentColor:"#FF0000",
statusBarContentColor:"#FF0000"
})
}

exportdefaultclassMainAbilityextendsAbility{
...
asynconWindowStageCreate(windowStage:window.WindowStage){
letwindowClass:window.Window=awaitwindowStage.getMainWindow()
awaitenterImmersion(windowClass)
windowStage.loadContent('pages/page5')
}
...
}

③隐藏状态栏、导航栏

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

具体代码如下:

importwindowfrom'@ohos.window';
importcommonfrom'@ohos.app.ability.common';

@Entry
@Component
structType3{
@Statemessage:string='HelloWorld'
context:common.UIAbilityContext=getContext(this)ascommon.UIAbilityContext
asyncsetSystemBar(){
letwindowClass=awaitwindow.getLastWindow(context)
//设置导航栏,状态栏不可见
awaitwindowClass.setWindowSystemBarEnable([])
}

aboutToAppear(){
this.setSystemBar()
}

build(){
Row(){
Column(){
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
}
.backgroundColor("#ffee33")
.height('100%')
}
}

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8488

    浏览量

    150809
  • 游戏
    +关注

    关注

    2

    文章

    736

    浏览量

    26276
  • 开源
    +关注

    关注

    3

    文章

    3244

    浏览量

    42381
  • 界面开发
    +关注

    关注

    0

    文章

    6

    浏览量

    6278
  • OpenHarmony
    +关注

    关注

    25

    文章

    3658

    浏览量

    16129

原文标题:OpenHarmony沉浸式界面开发

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenHarmony南向开发案例:【分布画板】

    使用OpenHarmony3.1-Release开发的应用。通过OpenHarmony的分布技术,使多人能够一起画画。
    的头像 发表于 04-12 14:40 999次阅读
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>开发</b>案例:【分布<b class='flag-5'>式</b>画板】

    鸿蒙应用/元服务开发-窗口(Stage模型)体验窗口沉浸能力

    的),达到预期效果。 二、开发步骤 1.获取应用主窗口。 通过getMainWindow接口获取应用主窗口。 2.实现沉浸效果。 调用setWindowSystemBarEnable接口,设置导航栏
    发表于 02-06 15:08

    沉浸互动投影大揭秘!原来它是这样的...

    `沉浸互动投影近两年备受关注,作为一种新型的投影方式,作为一个高科技创新的产物,就是从各个层面包围着观众,能够全面的覆盖观众的视角,达到一种身临其境的体验感,被越来越多的领域所应用。 沉浸
    发表于 12-10 18:14

    OpenHarmony 应用开发快速入门

    Studio V2.2 Beta1及更高版本,在使用JS语言开发时,除传统代码方式外,还支持使用低代码方式。OpenHarmony代码
    发表于 05-06 16:03

    OpenHarmony快速入门及开发应用所必备的基础知识

    及更高版本中支持。OpenHarmony代码开发方式具有丰富的UI界面编辑功能,遵循JS开发规范,通过可视化
    发表于 05-12 14:11

    【PIMF】低代码(可视化界面)入门OpenHarmony3.1 Release应用开发

    Studio 3.0 Beta3 for OpenHarmony进行低代码开发OpenHarmony应用。前言OpenHarmony 3.
    发表于 05-20 11:54

    OpenHarmony 官网文档有哪些上新?上篇:应用开发文档上新

    信息中心,首版本支持如下能力:● 提供 OpenHarmony 应用开发快速入门、DevEco Studio 版本说明、常见问题的内容集成,沉浸的信息阅读体验。● 支持文档内容与
    发表于 06-14 11:17

    开发样例】OpenHarmony分布购物车

    设计OpenHarmony技术特性eTS UI分布调度分布数据管理3.支持OpenHarmony版本OpenHarmony 3.0 LT
    发表于 07-29 14:17

    沉浸剖析OpenHarmony代码》开放100页样章

    沉浸剖析OpenHarmony代码》开放100页样章梁开祝2022.09.29这本书正在排版印刷中,不出意外的话,在10月中下旬便可面市了。目前,此书的定价和订购链接暂时还没有确
    发表于 09-29 11:33

    openharmony代码质量如何 openharmony代码下载地址

    概念定义的新型应用,不支持基于安卓 API/SDK 开发的用户应用程序运行。   源码获取方式        openharmony代码下载地址:https://hmxt.org
    的头像 发表于 06-22 17:18 1971次阅读

    openharmony 运行代码操作

    openharmony 运行代码操作 openharmony 运行代码,本文主要介绍windows环境下OpenHarmony社区
    的头像 发表于 06-21 19:46 2138次阅读

    openharmony分支代码开源

    代码。 据了解,OpenHarmony是开放原子开源基金会孵化及运营的开源项目,由华为捐赠。 L2 分支没有安卓代码,是完全的鸿蒙系统,能够使用鸿蒙的分布应用,不兼容安卓。
    的头像 发表于 06-23 10:06 1403次阅读

    openharmony代码获取分析

    本文档将介绍如何获取OpenHarmony源码并说明OpenHarmony的源码目录结构。OpenHarmony代码以组件的形式开放,开发
    的头像 发表于 06-23 16:30 2672次阅读
    <b class='flag-5'>openharmony</b><b class='flag-5'>代码</b>获取分析

    基于OpenHarmony的分布应用开发框架使用教程

    电子发烧友网站提供《基于OpenHarmony的分布应用开发框架使用教程.zip》资料免费下载
    发表于 04-12 11:19 9次下载

    openharmony开源社区 OpenHarmony开发样例上新了

    工作委员会负责运作。OpenHarmony 是由华为公司捐赠智能终端操作系统基础能力相关代码,由全球开发者共建的开源分布操作系统,具备面向全场景、分布
    的头像 发表于 04-25 16:37 2371次阅读