Android復習(五)設備兼容—>支持劉海屏


支持劉海屏

帶劉海屏的設備

劉海屏是指某些設備顯示屏上的一個區域延伸到顯示面,這樣既能為用戶提供全面屏體驗,又能為設備正面的重要傳感器留出空間。Android 在搭載 Android 9(API 級別 28)及更高版本的設備上正式支持劉海屏。請注意,設備制造商也可以選擇在搭載 Android 8.1 或更低版本的設備上支持劉海屏。

本主題介紹如何實現對帶劉海屏的設備的支持,包括如何處理“劉海區域”,即顯示面上包含劉海的無邊框矩形。

在帶劉海屏的設備上有什么要求

為了確保一致性和應用兼容性,搭載 Android 9 的設備必須確保以下劉海行為:

  • 一條邊緣最多只能包含一個劉海。
  • 一台設備不能有兩個以上的劉海。
  • 設備的兩條較長邊緣上不能有劉海。
  • 在未設置特殊標志的豎屏模式下,狀態欄的高度必須至少與劉海的高度持平。
  • 默認情況下,在全屏模式或橫屏模式下,整個劉海區域必須顯示黑邊。

選擇您的應用如何處理劉海區域

如果不希望您的內容與劉海區域重疊,請確保您的內容不與狀態欄和導航欄重疊,這樣做一般就足夠了。如果您要將內容呈現到劉海區域中,則可以使用 WindowInsets.getDisplayCutout() 來檢索 DisplayCutout 對象,該對象包含每個劉海區域的安全邊襯區和邊界框。您可以使用這些 API 來檢查您的內容是否與劉海區域重疊,以便根據需要重新放置。

注意:要在多個 API 級別管理劉海實現,您還可以使用  AndroidX 庫(可通過 SDK 管理器獲得)中的  DisplayCutoutCompat

Android 還允許您控制是否在劉海區域內顯示內容。窗口布局屬性 layoutInDisplayCutoutMode 控制您的內容如何呈現在劉海區域中。您可以將 layoutInDisplayCutoutMode 設為以下某個值:

您可以通過編程或在 Activity 中設置樣式來設置劉海模式。以下示例定義了一種樣式,您可以使用它將 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 屬性應用到 Activity。

    <style name="ActivityTheme">
      <item name="android:windowLayoutInDisplayCutoutMode">
        shortEdges <!-- default, shortEdges, never -->
      </item>
    </style>
   
 

下面幾部分更詳細地介紹了不同的劉海模式。

默認行為

默認情況下,在未設置特殊標志的豎屏模式下,在帶劉海屏的設備上,狀態欄的大小會調整為至少與劉海一樣高,而您的內容會顯示在下方區域。在橫屏模式或全屏模式下,您的應用窗口會顯示黑邊,因此您的任何內容都不會顯示在劉海區域中。

將內容呈現在短邊劉海區域中

對於某些內容(如視頻、照片、地圖和游戲),呈現在劉海區域中是一種很好的方法,這樣能夠為用戶提供沉浸感更強的全面屏體驗。如果設置了 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,則在豎屏模式和橫屏模式下,內容都會延伸到顯示屏的短邊上的劉海區域,而不管系統欄處於隱藏還是可見狀態。請注意,窗口無法延伸到屏幕的長邊上的劉海區域。使用此模式時,請確保沒有重要內容與劉海區域重疊。

請注意,Android 可能不允許內容視圖與系統欄重疊。要替換此行為並強制內容延伸到劉海區域,請通過 View.setSystemUiVisibility(int) 方法將以下任一標志應用於視圖可見性:

  • SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  • SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
  • SYSTEM_UI_FLAG_LAYOUT_STABLE

下面是一些 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 示例:

 

在豎屏模式下將內容呈現到劉海區域中

 

 

在橫屏模式下將內容呈現到劉海區域中

 

請注意,邊角處的劉海可等同於在短邊上,因此適用同樣的行為:

帶邊角劉海屏的設備

從不將內容呈現在劉海區域中

如果設置了 LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER,則不允許窗口與劉海區域重疊。

此模式應該用於暫時設置 View.SYSTEM_UI_FLAG_FULLSCREEN 或 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 的窗口,以避免在設置或清除了該標志時執行另一種窗口布局。

請查看下面的 LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 示例:

特殊模式

某些搭載 Android 8.1(API 級別 27)或更低版本的設備支持一種特殊模式,可讓用戶將顯示黑邊的全屏或橫屏應用延伸到劉海區域。此模式通常使用導航欄中的切換開關來控制,在延伸屏幕之前會顯示一個對話框,要求用戶進行確認。

支持劉海屏的最佳做法

使用劉海屏時,請務必考慮以下幾點:

  • 不要讓劉海區域遮蓋任何重要的文本、控件或其他信息。
  • 不要將任何需要精細輕觸識別的交互式元素放置或延伸到劉海區域。劉海區域中的輕觸靈敏度可能要比其他區域低一些。
  • 避免對狀態欄高度進行硬編碼,因為這樣做可能會導致內容重疊或被切斷。如有可能,請使用 WindowInsetsCompat 檢索狀態欄高度,並確定要對您的內容應用的適當內邊距。

  • 不要假定應用會占據整個窗口,而應使用 View.getLocationInWindow() 來確認應用的位置。不要使用 View.getLocationOnScreen()

  • 務必妥善處理進入或退出全屏模式。請閱讀這篇 Android 開發者博文

  • 對於豎屏模式下的默認劉海行為,如果劉海區域位於頂部邊緣,並且窗口未設置 FLAG_FULLSCREEN 或 View.SYSTEM_UI_FLAG_FULLSCREEN,則窗口可以延伸到劉海區域。同樣,如果劉海區域位於底部邊緣,並且窗口未設置 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION,則窗口可以延伸到劉海區域。在全屏模式或橫屏模式下,窗口的布局方式應確保其不與劉海區域重疊。

  • 如果您的應用需要進入和退出全屏模式,請使用 shortEdges 或 never 劉海模式。默認劉海行為可導致應用中的內容在全屏模式轉換過程中上下移動,如下圖所示:

  • 在全屏模式下,在使用窗口坐標與屏幕坐標時應保持謹慎,因為在顯示黑邊的情況下,您的應用不會占據整個屏幕。由於顯示黑邊,因此根據屏幕原點得到的坐標與根據窗口原點得到的坐標不再相同。您可以根據需要使用 getLocationOnScreen() 將屏幕坐標轉換為視圖坐標。下圖展示了內容顯示黑邊時這兩種坐標有何不同:

    處理 MotionEvent 時,請使用 MotionEvent.getX() 和 MotionEvent.getY() 來避免類似的坐標問題。不要使用 MotionEvent.getRawX() 或 MotionEvent.getRawY()

測試您的內容如何呈現

在模擬器中模擬劉海屏

請務必測試應用的所有屏幕和體驗。如有可能,在具有不同類型劉海屏的設備上進行測試。如果您沒有帶劉海屏的設備,可以在搭載 Android 9 的任意設備或模擬器上模擬一些常見的劉海配置,具體操作步驟如下:

  1. 啟用開發者選項
  2. 開發者選項屏幕中,向下滾動到繪制部分,然后選擇模擬劉海屏。
  3. 選擇劉海類型。

 

 

其他資源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM