沉浸式界面通常是指全屏顯示,即當(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 類型。
具體代碼如下:
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%') } }
-
接口
+關(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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論