一、鴻蒙沉浸式簡介
在鴻蒙系統中,沉浸式是一種極具特色的設計理念,它致力于讓用戶在使用應用時能夠全身心投入到內容本身,而盡可能減少被系統界面元素的干擾。通常來說,就是將應用的內容區巧妙地延伸到狀態欄和導航欄所在的界面區域 ,從而達成一種渾然一體的視覺體驗。
從用戶體驗的角度來看,沉浸式設計帶來了諸多顯著的提升。一方面,它能使頁面與狀態欄、導航欄的色調完美統一,避免出現色彩上的突兀感,進而為用戶營造出更為和諧、舒適的視覺感受。就好比我們在使用視頻播放應用時,開啟沉浸式后,視頻畫面能夠無縫銜接至屏幕邊緣,整個屏幕都被視頻內容所填滿,讓我們仿佛置身于一個專屬的私人影院之中,極大地增強了觀看的沉浸感和代入感。另一方面,這種設計還最大程度地利用了屏幕的可視區域,為頁面提供了更廣闊的布局空間,使得應用能夠展示更多的內容,或者以更合理的方式組織界面元素。例如在閱讀類應用中,沉浸式模式下文字能夠鋪滿整個屏幕,減少了頁面的留白,讓我們可以專注于閱讀,享受沉浸式的閱讀樂趣,盡情沉浸在知識的海洋里,不受外界因素的打擾。
正是由于沉浸式設計在提升用戶體驗方面有著如此重要的作用,所以深入了解并掌握其在鴻蒙系統中的實現方法就顯得尤為關鍵。接下來,我將詳細介紹在鴻蒙系統中實現沉浸式效果的多種實用方法。
二、實現方式
(一)Window.setWindowLayoutFullScreen 方法
使用Window.setWindowLayoutFullScreen方法實現沉浸式效果,主要步驟如下:
- 獲取應用主窗口:在UIAbility的onWindowStageCreate生命周期方法中,通過windowStage.getMainWindow()方法來獲取應用的主窗口。這個方法返回一個Promise對象,我們可以使用then方法來處理獲取成功后的邏輯。
- 設置窗口為全屏模式:在成功獲取主窗口后,調用主窗口對象的setWindowLayoutFullScreen(true)方法,將窗口的布局設置為全屏模式,從而實現沉浸式效果。如果設置過程中出現錯誤,catch方法會捕獲到錯誤信息并進行相應處理。
- 加載目標頁面:完成上述步驟后,通過windowStage.loadContent("pages/Index", (err) => {... })方法為窗口加載對應的目標頁面。如果加載過程中出現錯誤,會在回調函數中進行錯誤處理,打印錯誤信息;若加載成功,則打印成功信息。
以下是完整的代碼示例:
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {// 1.獲取應用主窗口let windowClass: window.Window | undefined = undefined;windowStage.getMainWindow().then(windowClass => {console.info('Succeeded in obtaining the main window. Data: ' + JSON.stringify(windowClass));// 2.設置窗口全屏,實現沉浸式效果windowClass.setWindowLayoutFullScreen(true).then(() => {console.info('Succeeded in setting the window layout to full - screen mode.');}).catch((e: BusinessError) => {console.error('Failed to set the window layout to full - screen mode. Cause:' + JSON.stringify(e));});}).catch((err: BusinessError) => {console.error('Failed to obtain the main window. Cause: ' + JSON.stringify(err));});// 3.為沉浸式窗口加載對應的目標頁面windowStage.loadContent("pages/Index", (err) => {if (err.code) {console.error('Failed to load the content. Cause:' + JSON.stringify(err));return;}console.info('Succeeded in loading the content.');});}
}
這種方式實現的沉浸式效果是全局性的,即應用的所有頁面都會處于沉浸式狀態。如果某些頁面不需要沉浸式效果,還需要在這些頁面中通過獲取window來關閉沉浸式,例如在aboutToAppear生命周期方法中使用window.getLastWindow(getContext()).then(win => { win.setWindowLayoutFullScreen(false) })來關閉當前頁面的沉浸式效果 。
(二)expandSafeArea 屬性
expandSafeArea屬性是通過擴展組件的安全區域到狀態欄和導航欄,從而實現沉浸式效果。其原理是在布局階段,按照安全區范圍大小進行 UI 元素布局;布局完成后,查看設置了expandSafeArea的組件邊界(不包括margin)是否和安全區邊界相交。如果相交,則根據expandSafeArea傳遞的屬性進一步擴大組件繪制區域大小,覆蓋狀態欄、導航條這些非安全區域。這個過程僅改變組件自身繪制大小,不進行二次布局,也不影響子節點和兄弟節點的大小和位置。
expandSafeArea屬性接受兩個參數:
- 第一個參數types是一個Array<SafeAreaType>類型,用于配置擴展安全區域的類型,默認值為[SafeAreaType.SYSTEM, SafeAreaType.CUTOUT, SafeAreaType.KEYBOARD]。其中,SafeAreaType.SYSTEM表示系統區域(如狀態欄、導航欄);SafeAreaType.CUTOUT表示挖孔區域(在未添加相關配置項時,該類型可能不生效);SafeAreaType.KEYBOARD表示鍵盤區域。
- 第二個參數edges是一個Array<SafeAreaEdge>類型,用于配置擴展安全區域的方向,默認值為[SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM, SafeAreaEdge.START, SafeAreaEdge.END] 。SafeAreaEdge.TOP表示頂部;SafeAreaEdge.BOTTOM表示底部;SafeAreaEdge.START表示起始邊(對于從左到右的語言,通常是左邊;對于從右到左的語言,通常是右邊);SafeAreaEdge.END表示結束邊(與START相反)。
以下是使用expandSafeArea屬性實現沉浸式效果的示例代碼:
@Entry
@Component
struct Example {build() {Column() {Row() {Text('Top Row').fontSize(40).textAlign(TextAlign.Center).width('100%')}.backgroundColor('#F08080')// 設置頂部繪制延伸到狀態欄.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])Row() {Text('ROW2').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW3').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW4').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW5').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('Bottom Row').fontSize(40).textAlign(TextAlign.Center).width('100%')}.backgroundColor(Color.Orange)// 設置底部繪制延伸到導航條.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])}.width('100%').height('100%').alignItems(HorizontalAlign.Center).backgroundColor('#008000').justifyContent(FlexAlign.SpaceBetween)}
}
在上述示例中,通過為頂部和底部的Row組件分別設置expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])和expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]),使得頂部組件的繪制區域延伸到狀態欄,底部組件的繪制區域延伸到導航條,從而實現了沉浸式效果。需要注意的是,當父容器是滾動容器(如Scroll)時,設置expandSafeArea屬性可能不生效;并且設置該屬性時,組件不能設置固定寬高尺寸(百分比除外) 。此外,使用expandSafeArea屬性是按需設置的,只會對當前設置的組件生效,不會影響其他組件和頁面。
三、應用案例分析
(一)阿維塔 11 鴻蒙座艙
阿維塔 11 鴻蒙座艙在多個場景中充分展現了鴻蒙沉浸式技術的魅力。在導航場景下,Petal Maps 為用戶帶來了前所未有的體驗。它不僅實現了多個地圖整合覆蓋,讓用戶在選擇路線時可享受地圖應用間的無感切換 ,還提供 “人駕路線” 和 “智駕路線”。當用戶在行車前選擇 “智駕路線”,車輛開啟智駕領航時,導航地圖能自行切換為 “智駕地圖”,無需手動操作,讓用戶能專注于駕駛正前方,減少操作分心,仿佛整個駕駛過程都有一位貼心的導航助手相伴,沉浸在安全、便捷的駕駛體驗中。
音樂場景中,阿維塔 11 鴻蒙座艙延續了 HarmonyOS 在移動終端上的極致性能和流暢體驗,采用智能后臺管控和內存分配 VIP 調度方案,實現操作跟手性、界面的切換順滑。用戶在切換音樂、調節音量等操作時,感受不到絲毫卡頓,就如同置身于一個專屬的音樂空間,盡情享受音樂帶來的愉悅。而且,當用戶在導航時打開音樂應用,導航界面會自動左移分屏,讓用戶更快捷地聽歌選曲,實現了多任務的高效協同,提升了用戶體驗的沉浸感。
視頻場景同樣出色,全屏畫面為用戶提供了沉浸式的觀影體驗。底部常駐工具欄在視頻場景下會自動隱藏,確保畫面的沉浸感,讓用戶仿佛置身于電影院中。此外,新增的手機投屏功能,支持鏡像模式、電腦模式、隱私模式三種投屏模式,用戶可以將手機上的視頻內容投屏到車機上,享受更大屏幕的觀影盛宴,進一步增強了沉浸感 。
(二)其他應用場景案例
在游戲場景中,基于 HarmonyOS NEXT 方舟圖形引擎能力,華為技術團隊針對重載游戲場景進行了專門優化。以《蒼翼:混沌效應》為例,啟動速度提升 52%,借助端云編譯技術,讓玩家無需漫長等待,快速進入游戲世界。同時,基于鴻蒙視窗系統超分算法進行超采樣、端云二進制優化,顯著提升了設備的能效和溫控表現,還原游戲內華麗的動作、特效表演,帶給玩家流暢絲滑的游戲體驗,使其全身心沉浸在緊張刺激的游戲對戰中 。
視頻播放應用充分利用了鴻蒙沉浸式技術,當用戶播放視頻時,通過設置沉浸式效果,視頻畫面能夠延伸至整個屏幕,狀態欄和導航欄被巧妙隱藏,避免了對視頻內容的干擾。用戶仿佛被視頻內容完全包圍,無論是觀看電影、電視劇還是短視頻,都能獲得更加身臨其境的感受,沉浸在精彩的視頻情節中。
閱讀應用也借助鴻蒙沉浸式技術為用戶打造了優質的閱讀環境。例如華為閱讀升級了 “一鏡到底” 閱讀模式,用戶打開精品書書籍時,能看到不同的 “微動效”,系統會依據所選書籍自動匹配合適的主題字體,還根據不同設備的尺寸為精品書籍設計不同的排版,視頻動態、精美插圖也能內置到書籍之中。這些設計讓用戶在閱讀時仿佛置身于書籍所描繪的世界中,沉浸在知識的海洋里,享受純粹的閱讀樂趣。
四、適配與優化
(一)處理避讓區域和頁面內容的適配問題
在實現應用頁面沉浸式效果后,由于避讓區本身展示著電量、時間等系統信息,或者存在如導航條點擊、上滑等手勢交互,所以常常會與應用頁面產生 UI 元素的遮擋、視覺違和或交互沖突等問題 。針對這些不同場景,開發者可以采取以下幾種有效的適配方式:
- 設置系統欄顯隱:使用Window.setWindowSystemBarEnable()方法或Window.setSpecificSystemBarEnabled()方法來設置狀態欄和導航欄的顯隱。例如在視頻播放應用中,當進入全屏播放時,通過windowClass.setSpecificSystemBarEnabled('status', false)和windowClass.setSpecificSystemBarEnabled('navigationIndicator', false)將狀態欄和導航欄隱藏,避免其對視頻畫面的遮擋,讓用戶能夠專注于視頻內容;而當退出全屏時,再將它們顯示出來,方便用戶進行其他操作 。
- 設置系統欄樣式:利用Window.setWindowSystemBarProperties()方法可以設置狀態欄和導航欄的樣式。比如可以將狀態欄的背景色設置為透明,內容顏色根據應用背景色進行調整,使狀態欄與應用界面在視覺上更加融合。如在一個淺色背景的閱讀應用中,將狀態欄的背景色設置為透明statusBarColor: "#00ffffff",內容顏色設置為黑色statusBarContentColor: "#000000",這樣既能保證用戶能看到狀態欄的信息,又不會破壞應用整體的視覺協調性 。
- 獲取避讓區域高度實現內容避讓:調用Window.getWindowAvoidArea()方法能夠獲取避讓區域的高度,然后根據這個高度設置應用頁面內容的上下padding,從而實現對狀態欄和導航欄的避讓。例如在一個聊天應用中,獲取到導航欄的高度后,給聊天輸入框所在的容器底部設置相應高度的padding,防止輸入框被導航欄遮擋,確保用戶在輸入消息時能夠正常看到輸入內容 。
- 獲取挖孔區域信息實現挖孔區避讓:通過Display.getCutoutInfo()方法可以獲取挖孔區域的寬高和位置信息,然后設置對應避讓元素的margin來實現挖孔區的避讓。在一些游戲應用中,為了避免游戲中的關鍵元素(如生命值顯示、技能按鈕等)被挖孔區域遮擋,根據獲取到的挖孔區域信息,給這些元素設置合適的margin,保證游戲界面的完整性和操作的便捷性 。
(二)不同設備和屏幕尺寸的適配要點
在不同設備上實現沉浸式效果時,確保布局和樣式的一致性是非常重要的。由于鴻蒙系統應用需要適配手機、平板、智能穿戴設備、智慧屏等多種終端設備,這些設備的屏幕尺寸、分辨率和屏幕比例各不相同,所以在開發過程中需要注意以下幾點:
- 使用彈性布局:采用彈性布局(如 Flex 布局)能夠使界面元素根據屏幕大小自動調整位置和大小。在一個新聞應用中,使用 Flex 布局來排列新聞列表項,無論在手機的小屏幕還是平板的大屏幕上,新聞標題、圖片和摘要等元素都能合理分布,保持良好的視覺效果。同時,避免使用固定像素值來設置元素的大小和位置,盡量使用百分比、vh(視口高度)、vw(視口寬度)等相對單位,以確保界面在不同屏幕尺寸下都能自適應 。
- 媒體查詢:利用媒體查詢(Media Query)可以根據設備的屏幕尺寸、分辨率等條件來應用不同的樣式。比如當檢測到設備是平板時,增大字體大小和元素間距,以適應大屏幕的顯示;當檢測到是手機時,采用更緊湊的布局,充分利用有限的屏幕空間。在一個電商應用中,通過媒體查詢,在手機上展示商品列表時采用單列布局,而在平板上則采用雙列布局,提高頁面的信息展示效率 。
- 圖片適配:針對不同設備的屏幕分辨率,提供不同分辨率的圖片資源。使用image組件時,可以通過srcset屬性指定多個不同分辨率的圖片路徑,讓系統根據設備屏幕的實際情況選擇最合適的圖片進行加載。在一個旅游應用中,展示風景圖片時,為高清屏幕的手機提供高分辨率的圖片,在普通屏幕設備上則加載低分辨率圖片,既能保證圖片的清晰度,又能減少數據流量的消耗和加載時間 。
- 測試與優化:在各種不同類型和尺寸的設備上進行充分的測試,檢查沉浸式效果的實現情況以及布局和樣式的顯示效果。通過測試發現并解決可能出現的問題,如元素錯位、文字截斷、顏色顯示異常等,不斷優化應用的適配性,為用戶提供一致且優質的體驗 。
五、未來展望
隨著技術的不斷發展和創新,鴻蒙沉浸式技術擁有著廣闊的發展前景和巨大的潛力,有望在更多領域得到深度應用和拓展。
在智能汽車領域,鴻蒙沉浸式技術將進一步提升人車交互體驗。未來的汽車座艙不僅僅是一個駕駛空間,更將成為一個智能生活的移動樞紐。通過與手機、智能家居等設備的無縫互聯,實現多設備之間的信息共享和協同工作。例如,當用戶從家中出發前往汽車時,手機上的導航信息可以自動同步到車機上,無需手動輸入目的地;在駕駛過程中,用戶可以通過語音指令控制家中的智能設備,如提前打開空調、關閉燈光等,真正實現 “人車家” 全場景互聯,讓用戶在駕駛過程中享受到更加便捷、智能、沉浸式的體驗。
在智能穿戴設備方面,鴻蒙沉浸式技術將為用戶帶來更加個性化、便捷的健康管理和運動監測體驗。智能手表、手環等設備可以實時監測用戶的心率、睡眠、運動步數等健康數據,并通過沉浸式的界面設計和交互方式,將這些數據以直觀、易懂的方式呈現給用戶。同時,結合人工智能技術,為用戶提供個性化的健康建議和運動計劃。例如,當用戶在運動時,智能手表可以實時顯示運動數據,并根據用戶的運動狀態和目標,提供實時的運動指導和建議,讓用戶仿佛擁有一個私人健身教練陪伴在身邊。
在教育領域,鴻蒙沉浸式技術將助力打造更加生動、高效的學習環境。通過虛擬現實(VR)、增強現實(AR)等技術與教育內容的深度融合,為學生提供沉浸式的學習體驗。例如,在歷史、地理等學科的學習中,學生可以通過 VR 設備身臨其境地感受歷史事件的發生場景,或者探索世界各地的地理風貌,增強學習的趣味性和互動性;在實驗教學中,AR 技術可以將虛擬實驗設備與現實場景相結合,讓學生在安全、便捷的環境下進行實驗操作,提高學習效果。
在工業制造領域,鴻蒙沉浸式技術也將發揮重要作用。工程師可以通過智能終端設備,利用沉浸式界面實時監控和管理生產線上的設備運行狀態、生產進度等信息。同時,借助虛擬現實技術,對產品設計、工藝流程進行虛擬仿真和優化,提前發現問題并解決,提高生產效率和產品質量。例如,在汽車制造過程中,工程師可以通過 VR 設備對汽車的設計方案進行沉浸式的評估和修改,確保設計的合理性和可行性;在生產線上,工人可以通過 AR 眼鏡獲取實時的操作指導和提示,提高工作效率和準確性。
鴻蒙沉浸式技術未來還可能在金融、醫療、旅游等眾多領域得到廣泛應用,為各行業的發展帶來新的機遇和變革。它將不斷拓展人們與數字世界交互的邊界,為用戶創造更加智能、便捷、沉浸式的生活和工作體驗,推動整個社會向智能化、數字化方向加速邁進 。讓我們共同期待鴻蒙沉浸式技術在未來綻放出更加絢爛的光彩,為我們的生活帶來更多的驚喜和可能。