Android適配全面屏上的齊劉海
原文連結:ofollow,noindex">https://android-developers.googleblog.com/2018/07/supporting-display-cutouts-on-edge-to.html
智慧手機正在快速地向全面屏和更大的寬高比發展。在這些裝置上,齊劉海是一種比較流行的實現全面屏體驗的方式,它在裝置的正面為重要的感測器提供了一小塊區域。目前,已經有11家裝置製造商釋出了16種帶有齊劉海的裝置,其中包括一些Android P 公測裝置,不久還會有更多這種裝置出現。
這些引人注目的顯示方式,為您展示您的App,提供了好時機。這也意味著比以前任何時候更重要的是,確保您的App在有一個或兩個劉海的裝置,以及18:9和更大寬高比的裝置上,提供始終如一的出色體驗。
使您的App與齊劉海裝置相容
隨著齊劉海裝置越來越多,您應該做些什麼來確保App做好了齊劉海裝置的相容呢?
好訊息是,在大多數情況下,您的App即使在有齊劉海的裝置上也應該按預期正常執行。預設在沒有設定特殊標誌的豎屏情況下,狀態列將被縮放到和齊劉海一樣的高度,app內容將顯示在劉海下面的視窗中。在橫屏或全屏模式,您的App視窗將會變成信封形狀,以便您的所有內容不會都顯示在劉海區域。
然而,在齊劉海裝置上,您的App在一些區域的顯示可能存在問題。
- 狀態列的高度以任何形式的硬編碼來獲取,都要小心。這很可能引起問題。如果可能的話,請使用WindowInsetsCompat 來獲取狀態列的高度。
- 全屏模式下,要仔細考慮何時使用視窗和螢幕座標,因為您的App在信箱狀態下不會佔用整個螢幕。舉個例子,如果使用MotionEvent.getRawX/Y() 為觸屏動作獲取螢幕座標,必須確保使用getLocationOnScreen() 把螢幕座標轉換成檢視座標。
- 要特別注意進入和退出全屏模式。
利用劉海區域
在劉海區域顯示您的App內容,是一種很好的方式,來給使用者提供身臨其境,全螢幕體驗,特別是像視訊,圖片,地圖和遊戲。
在Android P版本,我們增加了API,讓您方便管理App使用劉海的方式,以及檢測劉海區域是否存在並獲得他們的位置。
您可以使用layoutInDisplayCutoutMode (一種新的窗口布局模式),來控制內容相對於劉海區域的顯示。預設情況下,如果劉海完全包含在系統欄裡,App的視窗是可以延伸到劉海區域的。否則,窗口布局不能與劉海區域重疊。也可以通過layoutInDisplayCutoutMode 來設定內容是一直還是從不顯示在劉海區域。如果你想利用完整顯示,並不介意一些內容被劉海遮蓋,使用SHORT_EDGES 模式設定內容一直顯示在劉海區域是一種很好的選擇。
如果要顯示到劉海區域,可以使用getDisplayCutout() 來檢索具有劉海安全插入和邊界框的DisplayCutout 。這些可以讓您檢測內容是否與劉海重疊,並在您需要時重新定位。
-
<style name="ActivityTheme"> <item name="android:windowLayoutInDisplayCutoutMode"> default/shortEdges/never </item></style>
對於執行在Android8.1(API 27)的裝置,我們反向移植了layoutInDisplayCutoutMode 活動主題屬性,以便您可以控制劉海區域內容的顯示。請注意,對執行在Android8.1或更低版本的裝置的支援取決於裝置製造商。
為了更方便地跨API級別管理劉海的實現,我們在AndroidX library 中增加了DisplayCutoutCompat ,現在可以通過SDK管理器獲得。
有關劉海顯示的更多資訊,請檢視文件 。
使用劉海測試您的app
我們強烈建議測試您的app在所有的螢幕和體驗上的相容性,確保它們都能在齊劉海裝置上執行良好。我們建議使用其中一款劉海的Android P Beta 裝置,例如Essential PH-1。
如果您沒有裝置,您還可以使用執行Android P或者Android模擬器 的任何裝置上使用模擬劉海進行測試。這可以幫助你發現您的應用可能會在具有劉海的裝置上遇到的任何問題,無論是Android8.1還是Android P。
在具有齊劉海的裝置上會發生什麼?
Android P引入了對齊劉海的官方平臺支援,您可以使用相關的API在齊劉海的內部或外部顯示您的內容。為了確保一致性和App的相容性,我們正在和裝置製造商合作伙伴合作來滿足一些需求。
首先,裝置必須確保它們的齊劉海不會對App產生消極的影響。有兩點要特別注意:
- 在豎屏狀態,沒有設定特殊標識,狀態列必須至少延伸到劉海的高度。
- 在全屏或橫屏狀態,整個劉海區域應該收起。
其次,裝置應該有且僅有一個劉海在裝置的每一個短邊。這意味著:
- 您將不會看到在一邊有多個劉海,或者說在一臺裝置上有多個劉海。
- 您將不會看到在裝置左邊或右邊的長邊有劉海。
在這些限制條件下,裝置可以在任何地方放置劉海。
特殊模式
一些執行Android 8.1(API level 27)或者更早版本系統的裝置,可選擇支援“特殊模式”,允許使用者將帶信封樣式的全屏或橫屏App延伸到劉海區域。這些裝置一般通過導航欄的切換提供這種模式,然後延伸螢幕前彈出一個確認框。
如果App支援,提供“特殊模式”的裝置允許裝置選擇性地延伸App到劉海區域。
如果您的App的目標SDK版本是27或著更高,您可以設定layoutInDisplayCutoutMode 介面主題屬性,以便在需要時推出特殊模式。
請不要忘記:更大的寬高比!
當您在做劉海支援時,也是確保您的App在18:9或者更大寬高比的裝置上執行良好的好時機,特別是這些裝置越來越普遍並且可以顯示劉海。
我們非常鼓勵您支援靈活的寬高比,這樣您的App就可以利用整個顯示區域,無論它在哪種裝置上。您應該在不同的解析度上測試您的App,確保它執行正常並且看起來美觀。
以下是有關螢幕適配的一些指南 ,在您開發時請記住這些指南,另外請參考我們之前發表的更大寬高比的文章 ,以獲得有關優化的建議。如果您的App沒有適配長螢幕的解析度,你可以選擇宣告一個最大的解析度 以在這些螢幕上請求信箱。
感謝您的閱讀,我們希望這能幫助您為所有的使用者提供一個愉快的體驗,無論它們有什麼樣的螢幕顯示。