0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony沉浸式界面開發(fā)代碼教程

OpenHarmony技術(shù)社區(qū) ? 來源:OST開源開發(fā)者 ? 作者:OST開源開發(fā)者 ? 2023-06-06 09:26 ? 次閱讀

沉浸式界面通常是指全屏顯示,即當(dāng)前畫面占據(jù)整個(gè)屏幕。畫面放大的同時(shí),讓用戶擺脫無關(guān)信息的干擾,帶給用戶沉浸式的體驗(yàn)。

常見的場(chǎng)景有:視頻播放、游戲等。本例即為大家介紹如何開發(fā)沉浸式界面。

效果呈現(xiàn)

本例中的沉浸式界面有三種實(shí)現(xiàn)方式,對(duì)應(yīng)效果如下:

方案一:顏色背景鋪滿 方案二:圖片背景鋪滿

方案三:背景鋪滿的同時(shí)、狀態(tài)欄不可見

運(yùn)行環(huán)境

本例基于以下環(huán)境開發(fā),開發(fā)者也可以基于其他適配的版本進(jìn)行開發(fā):

IDE:DevEco Studio 3.1 Beta2

SDK:Ohos_sdk_public 3.2.11.9(API Version 9 Release)

實(shí)現(xiàn)思路

如果一個(gè)應(yīng)用想要獲得沉浸式的體驗(yàn),開發(fā)者可以通過以下三種方式進(jìn)行實(shí)現(xiàn):

顏色背景通鋪:使應(yīng)用頁(yè)面的背景色和狀態(tài)欄、導(dǎo)航欄的背景色一致。可通過 setWindowSystemBarProperties 進(jìn)行設(shè)置。

圖片背景通鋪:將狀態(tài)欄、導(dǎo)航欄的背景色設(shè)置為透明以便呈現(xiàn)應(yīng)用界面的背景,同時(shí)通過 windowClass.on 接口獲取到狀態(tài)欄、導(dǎo)航欄的區(qū)域信息,進(jìn)行規(guī)避處理,以免狀態(tài)欄、導(dǎo)航欄的內(nèi)容遮擋住應(yīng)用內(nèi)容。

隱藏導(dǎo)航欄和狀態(tài)欄:使用 setWindowSystemBarEnable 設(shè)置導(dǎo)航欄和狀態(tài)欄為隱藏狀態(tài)。

說明:沉浸式的設(shè)置最好放在 ability 的 onWindowStageCreate 的生命周期里,此時(shí)剛好可以獲取窗口的信息,放在頁(yè)面頁(yè)面生命周期里會(huì)出現(xiàn)窗口大小不一致,影響體驗(yàn)。

下文將分別介紹這三種方案的具體開發(fā)步驟。

開發(fā)步驟

①顏色背景通鋪

此方案通過調(diào)用 setWindowSystemBarProperties 接口將狀態(tài)欄和導(dǎo)航欄的背景色設(shè)置為跟應(yīng)用窗口相同的顏色,以達(dá)到界面全屏的效果。

具體代碼如下:


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

@Entry
@Component
structType2{
@Statemessage:string='HelloWorld'
//獲取UIAbility上下文
context:common.UIAbilityContext=getContext(this)ascommon.UIAbilityContext
asyncsetSystemBar(){
//獲取當(dāng)前應(yīng)用窗口
letwindowClass:window.Window=awaitwindow.getLastWindow(context)
//將狀態(tài)欄和導(dǎo)航欄的背景色設(shè)置為跟應(yīng)用窗口相同的顏色
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%')
}
}
此方案的優(yōu)勢(shì)在于不需要處理應(yīng)用窗口和狀態(tài)欄、導(dǎo)航欄窗口的遮擋關(guān)系,因?yàn)榇朔桨笡]有使用 setWindowLayoutFullScreen 接口設(shè)置沉浸式布局,所以三個(gè)窗口是平鋪的,不會(huì)重疊。劣勢(shì)在于無法將應(yīng)用的背景圖等信息延伸到狀態(tài)欄、導(dǎo)航欄窗口中。適用于扁平化設(shè)計(jì)風(fēng)格的應(yīng)用。

②圖片背景通鋪

這種方案可以實(shí)現(xiàn)圖片背景的通鋪,同時(shí)又能避免狀態(tài)欄和導(dǎo)航欄的內(nèi)容跟應(yīng)用內(nèi)容相互遮擋,導(dǎo)致顯示效果異常。

為了能讓應(yīng)用的有效顯示范圍避開系統(tǒng)的狀態(tài)欄和導(dǎo)航欄,以免內(nèi)容重疊,我們可以通過下面代碼獲取系統(tǒng)規(guī)避區(qū)域的大小,并對(duì)這一塊區(qū)域做出相應(yīng)的規(guī)避。

windowClass.on(type:‘a(chǎn)voidAreaChange’,callback:Callback<{AvoidAreaType,?AvoidArea}>)
其中回調(diào)參數(shù) AvoidArea 是規(guī)避區(qū)域,可以通過其獲取規(guī)避區(qū)域的具體范圍;AvoidAreaType 是規(guī)避區(qū)域的類型其取值如下,示例中需要規(guī)避的狀態(tài)欄和導(dǎo)航欄屬于 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(){
//在界面頂部放置一個(gè)Row組件,用于占位
Row(){

}
.width("100%")
//設(shè)置Row組件的高度為狀態(tài)欄的高度,可避免界面內(nèi)容與狀態(tài)欄內(nèi)容重疊
.height(px2vp(this.topHeight))
Row(){
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.position({x:0,y:0})
}
.width("100%")
.flexGrow(1)
//在界面底部放置一個(gè)Row組件,用于占位
Row(){

}
.width("100%")
//設(shè)置Row組件的高度為導(dǎo)航欄的高度,可避免界面內(nèi)容與導(dǎo)航欄內(nèi)容重疊
.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){
//獲取狀態(tài)欄和導(dǎo)航欄的高度
windowClass.on("avoidAreaChange",({type,area})=>{
if(type==window.AvoidAreaType.TYPE_SYSTEM){
//將狀態(tài)欄和導(dǎo)航欄的高度保存在AppStorage中
AppStorage.SetOrCreate("topHeight",area.topRect.height);
AppStorage.SetOrCreate("bottomHeight",area.bottomRect.height);
}
})
//設(shè)置窗口布局為沉浸式布局
awaitwindowClass.setWindowLayoutFullScreen(true)
awaitwindowClass.setWindowSystemBarEnable(["status","navigation"])
//設(shè)置狀態(tài)欄和導(dǎo)航欄的背景為透明
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')
}
...
}

③隱藏狀態(tài)欄、導(dǎo)航欄

隱藏狀態(tài)欄、導(dǎo)航欄可以達(dá)到完全沉浸的效果,使用 setWindowSystemBarEnable 接口即可實(shí)現(xiàn)。

具體代碼如下:

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)
//設(shè)置導(dǎo)航欄,狀態(tài)欄不可見
awaitwindowClass.setWindowSystemBarEnable([])
}

aboutToAppear(){
this.setSystemBar()
}

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

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8447

    瀏覽量

    150722
  • 游戲
    +關(guān)注

    關(guān)注

    2

    文章

    733

    瀏覽量

    26261
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3215

    瀏覽量

    42329
  • 界面開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    6276
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3635

    瀏覽量

    16061

原文標(biāo)題:OpenHarmony沉浸式界面開發(fā)

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    OpenHarmony南向開發(fā)案例:【分布畫板】

    使用OpenHarmony3.1-Release開發(fā)的應(yīng)用。通過OpenHarmony的分布技術(shù),使多人能夠一起畫畫。
    的頭像 發(fā)表于 04-12 14:40 ?967次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開發(fā)</b>案例:【分布<b class='flag-5'>式</b>畫板】

    鴻蒙應(yīng)用/元服務(wù)開發(fā)-窗口(Stage模型)體驗(yàn)窗口沉浸能力

    的),達(dá)到預(yù)期效果。 二、開發(fā)步驟 1.獲取應(yīng)用主窗口。 通過getMainWindow接口獲取應(yīng)用主窗口。 2.實(shí)現(xiàn)沉浸效果。 調(diào)用setWindowSystemBarEnable接口,設(shè)置導(dǎo)航欄
    發(fā)表于 02-06 15:08

    沉浸互動(dòng)投影大揭秘!原來它是這樣的...

    `沉浸互動(dòng)投影近兩年備受關(guān)注,作為一種新型的投影方式,作為一個(gè)高科技創(chuàng)新的產(chǎn)物,就是從各個(gè)層面包圍著觀眾,能夠全面的覆蓋觀眾的視角,達(dá)到一種身臨其境的體驗(yàn)感,被越來越多的領(lǐng)域所應(yīng)用。 沉浸
    發(fā)表于 12-10 18:14

    OpenHarmony 應(yīng)用開發(fā)快速入門

    Studio V2.2 Beta1及更高版本,在使用JS語言開發(fā)時(shí),除傳統(tǒng)代碼方式外,還支持使用低代碼方式。OpenHarmony代碼
    發(fā)表于 05-06 16:03

    OpenHarmony快速入門及開發(fā)應(yīng)用所必備的基礎(chǔ)知識(shí)

    及更高版本中支持。OpenHarmony代碼開發(fā)方式具有豐富的UI界面編輯功能,遵循JS開發(fā)規(guī)范,通過可視化
    發(fā)表于 05-12 14:11

    【PIMF】低代碼(可視化界面)入門OpenHarmony3.1 Release應(yīng)用開發(fā)

    Studio 3.0 Beta3 for OpenHarmony進(jìn)行低代碼開發(fā)OpenHarmony應(yīng)用。前言OpenHarmony 3.
    發(fā)表于 05-20 11:54

    OpenHarmony 官網(wǎng)文檔有哪些上新?上篇:應(yīng)用開發(fā)文檔上新

    信息中心,首版本支持如下能力:● 提供 OpenHarmony 應(yīng)用開發(fā)快速入門、DevEco Studio 版本說明、常見問題的內(nèi)容集成,沉浸的信息閱讀體驗(yàn)?!?支持文檔內(nèi)容與
    發(fā)表于 06-14 11:17

    開發(fā)樣例】OpenHarmony分布購(gòu)物車

    設(shè)計(jì)OpenHarmony技術(shù)特性eTS UI分布調(diào)度分布數(shù)據(jù)管理3.支持OpenHarmony版本OpenHarmony 3.0 LT
    發(fā)表于 07-29 14:17

    沉浸剖析OpenHarmony代碼》開放100頁(yè)樣章

    沉浸剖析OpenHarmony代碼》開放100頁(yè)樣章梁開祝2022.09.29這本書正在排版印刷中,不出意外的話,在10月中下旬便可面市了。目前,此書的定價(jià)和訂購(gòu)鏈接暫時(shí)還沒有確
    發(fā)表于 09-29 11:33

    openharmony代碼質(zhì)量如何 openharmony代碼下載地址

    概念定義的新型應(yīng)用,不支持基于安卓 API/SDK 開發(fā)的用戶應(yīng)用程序運(yùn)行。 ? 源碼獲取方式 ? ? ? ?openharmony代碼下載地址:https://hmxt.org
    的頭像 發(fā)表于 06-22 17:18 ?1936次閱讀

    openharmony 運(yùn)行代碼操作

    openharmony 運(yùn)行代碼操作 openharmony 運(yùn)行代碼,本文主要介紹windows環(huán)境下OpenHarmony社區(qū)
    的頭像 發(fā)表于 06-21 19:46 ?2126次閱讀

    openharmony分支代碼開源

    代碼。 據(jù)了解,OpenHarmony是開放原子開源基金會(huì)孵化及運(yùn)營(yíng)的開源項(xiàng)目,由華為捐贈(zèng)。 L2 分支沒有安卓代碼,是完全的鴻蒙系統(tǒng),能夠使用鴻蒙的分布應(yīng)用,不兼容安卓。
    的頭像 發(fā)表于 06-23 10:06 ?1397次閱讀

    openharmony代碼獲取分析

    本文檔將介紹如何獲取OpenHarmony源碼并說明OpenHarmony的源碼目錄結(jié)構(gòu)。OpenHarmony代碼以組件的形式開放,開發(fā)
    的頭像 發(fā)表于 06-23 16:30 ?2660次閱讀
    <b class='flag-5'>openharmony</b><b class='flag-5'>代碼</b>獲取分析

    基于OpenHarmony的分布應(yīng)用開發(fā)框架使用教程

    電子發(fā)燒友網(wǎng)站提供《基于OpenHarmony的分布應(yīng)用開發(fā)框架使用教程.zip》資料免費(fèi)下載
    發(fā)表于 04-12 11:19 ?9次下載

    openharmony開源社區(qū) OpenHarmony開發(fā)樣例上新了

    工作委員會(huì)負(fù)責(zé)運(yùn)作。OpenHarmony 是由華為公司捐贈(zèng)智能終端操作系統(tǒng)基礎(chǔ)能力相關(guān)代碼,由全球開發(fā)者共建的開源分布操作系統(tǒng),具備面向全場(chǎng)景、分布
    的頭像 發(fā)表于 04-25 16:37 ?2354次閱讀