劉海屏是指某些設(shè)備顯示屏上的一個區(qū)域延伸到顯示面,這樣既能為用戶提供全面屏體驗,又能為設(shè)備正面的重要傳感器留出空間。Android 在搭載 Android 9(API 級別 28)及更高版本的設(shè)備上正式支持劉海屏。請注意,設(shè)備制造商也可以選擇在搭載 Android 8.1 或更低版本的設(shè)備上支持劉海屏。
本主題介紹如何實現(xiàn)對帶劉海屏的設(shè)備的支持,包括如何處理“劉海區(qū)域”,即顯示面上包含劉海的無邊框矩形。
為了確保一致性和應(yīng)用兼容性,搭載 Android 9 的設(shè)備必須確保以下劉海行為:
如果不希望您的內(nèi)容與劉海區(qū)域重疊,請確保您的內(nèi)容不與狀態(tài)欄和導(dǎo)航欄重疊,這樣做一般就足夠了。如果您要將內(nèi)容呈現(xiàn)到劉海區(qū)域中,則可以使用 WindowInsets.getDisplayCutout() 來檢索 DisplayCutout 對象,該對象包含每個劉海區(qū)域的安全邊襯區(qū)和邊界框。您可以使用這些 API 來檢查您的內(nèi)容是否與劉海區(qū)域重疊,以便根據(jù)需要重新放置。
注意:要在多個 API 級別管理劉海實現(xiàn),您還可以使用 AndroidX 庫(可通過 SDK 管理器獲得)中的 DisplayCutoutCompat。Android 還允許您控制是否在劉海區(qū)域內(nèi)顯示內(nèi)容。窗口布局屬性 layoutInDisplayCutoutMode 控制您的內(nèi)容如何呈現(xiàn)在劉海區(qū)域中。您可以將 layoutInDisplayCutoutMode
設(shè)為以下某個值:
您可以通過編程或在 Activity 中設(shè)置樣式來設(shè)置劉海模式。以下示例定義了一種樣式,您可以使用它將 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
屬性應(yīng)用到 Activity。
下面幾部分更詳細地介紹了不同的劉海模式。
默認情況下,在未設(shè)置特殊標志的豎屏模式下,在帶劉海屏的設(shè)備上,狀態(tài)欄的大小會調(diào)整為至少與劉海一樣高,而您的內(nèi)容會顯示在下方區(qū)域。在橫屏模式或全屏模式下,您的應(yīng)用窗口會顯示黑邊,因此您的任何內(nèi)容都不會顯示在劉海區(qū)域中。
對于某些內(nèi)容(如視頻、照片、地圖和游戲),呈現(xiàn)在劉海區(qū)域中是一種很好的方法,這樣能夠為用戶提供沉浸感更強的全面屏體驗。如果設(shè)置了 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,則在豎屏模式和橫屏模式下,內(nèi)容都會延伸到顯示屏的短邊上的劉海區(qū)域,而不管系統(tǒng)欄處于隱藏還是可見狀態(tài)。請注意,窗口無法延伸到屏幕的長邊上的劉海區(qū)域。使用此模式時,請確保沒有重要內(nèi)容與劉海區(qū)域重疊。
請注意,Android 可能不允許內(nèi)容視圖與系統(tǒng)欄重疊。要替換此行為并強制內(nèi)容延伸到劉海區(qū)域,請通過 View.setSystemUiVisibility(int) 方法將以下任一標志應(yīng)用于視圖可見性:
下面是一些 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
示例:
請注意,邊角處的劉??傻韧谠诙踢吷?,因此適用同樣的行為:
如果設(shè)置了 LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER,則不允許窗口與劉海區(qū)域重疊。
此模式應(yīng)該用于暫時設(shè)置 View.SYSTEM_UI_FLAG_FULLSCREEN 或 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 的窗口,以避免在設(shè)置或清除了該標志時執(zhí)行另一種窗口布局。
請查看下面的 LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
示例:
某些搭載 Android 8.1(API 級別 27)或更低版本的設(shè)備支持一種特殊模式,可讓用戶將顯示黑邊的全屏或橫屏應(yīng)用延伸到劉海區(qū)域。此模式通常使用導(dǎo)航欄中的切換開關(guān)來控制,在延伸屏幕之前會顯示一個對話框,要求用戶進行確認。
使用劉海屏時,請務(wù)必考慮以下幾點:
避免對狀態(tài)欄高度進行硬編碼,因為這樣做可能會導(dǎo)致內(nèi)容重疊或被切斷。如有可能,請使用 WindowInsetsCompat 檢索狀態(tài)欄高度,并確定要對您的內(nèi)容應(yīng)用的適當內(nèi)邊距。
不要假定應(yīng)用會占據(jù)整個窗口,而應(yīng)使用 View.getLocationInWindow() 來確認應(yīng)用的位置。不要使用 View.getLocationOnScreen()。
務(wù)必妥善處理進入或退出全屏模式。請閱讀這篇 Android 開發(fā)者博文。
對于豎屏模式下的默認劉海行為,如果劉海區(qū)域位于頂部邊緣,并且窗口未設(shè)置 FLAG_FULLSCREEN 或 View.SYSTEM_UI_FLAG_FULLSCREEN,則窗口可以延伸到劉海區(qū)域。同樣,如果劉海區(qū)域位于底部邊緣,并且窗口未設(shè)置 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION,則窗口可以延伸到劉海區(qū)域。在全屏模式或橫屏模式下,窗口的布局方式應(yīng)確保其不與劉海區(qū)域重疊。
如果您的應(yīng)用需要進入和退出全屏模式,請使用 shortEdges
或 never
劉海模式。默認劉海行為可導(dǎo)致應(yīng)用中的內(nèi)容在全屏模式轉(zhuǎn)換過程中上下移動,如下圖所示:
在全屏模式下,在使用窗口坐標與屏幕坐標時應(yīng)保持謹慎,因為在顯示黑邊的情況下,您的應(yīng)用不會占據(jù)整個屏幕。由于顯示黑邊,因此根據(jù)屏幕原點得到的坐標與根據(jù)窗口原點得到的坐標不再相同。您可以根據(jù)需要使用 getLocationOnScreen() 將屏幕坐標轉(zhuǎn)換為視圖坐標。下圖展示了內(nèi)容顯示黑邊時這兩種坐標有何不同:
處理 MotionEvent
時,請使用 MotionEvent.getX() 和 MotionEvent.getY() 來避免類似的坐標問題。不要使用 MotionEvent.getRawX() 或 MotionEvent.getRawY()。
請務(wù)必測試應(yīng)用的所有屏幕和體驗。如有可能,在具有不同類型劉海屏的設(shè)備上進行測試。如果您沒有帶劉海屏的設(shè)備,可以在搭載 Android 9 的任意設(shè)備或模擬器上模擬一些常見的劉海配置,具體操作步驟如下:
當前文章:Android復(fù)習(五)設(shè)備兼容—>支持劉海屏-創(chuàng)新互聯(lián)
URL標題:http://aaarwkj.com/article48/gepep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、搜索引擎優(yōu)化、電子商務(wù)、網(wǎng)站改版、網(wǎng)站維護、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)