Android 凹口屏啟動界面適配

今天 Google 正式發(fā)布了 Android 9 Pie,所以也著手把應用的 Target Version 升級到 API 28,現(xiàn)在凹口屏 (又稱 "劉海屏") 的 Android 手機越來越多,Google 也是為了滿足各手機廠商這個發(fā)展趨勢提供了相應的 API。

我們可以參考 Google 的這篇 Android P 凹口屏支持,打造全面屏體驗
提到的凹口屏幕適配方案。也可以請查閱官方文檔《屏幕缺口支持指南》,了解適配過程中可能遇到的問題以及相應解決方案。

△ 凹口屏設備: Essential PH-1 (右) 和華為 P20 (左)

我們先來看看我的應用在沒有適配凹口屏時的啟動界面:
應用界面上方存在一條大黑邊:

適配前啟動界面

下面就來說說我在實際適配凹口屏 Android 手機的過程:

1. 開啟顯示凹口模式

如果你沒有凹口屏的真機,也可以在非凹口屏 P 版本手機或者 Android 模擬器中,開啟 "模擬具有凹口的顯示屏" 的設置項,然后再進行調(diào)試。

2. 適配長屏幕的全面屏

我們首先要確保應用在長屏幕設備上 (縱橫比大于或等于 18:9) 也能夠正常運行,尤其是現(xiàn)在市面上長屏手機越來越多,而且這些設備往往同時還采用了凹口屏設計。
當我們的應用布局無法適應任意大的寬高比,可以通過設置最大寬高比來聲明,Google 建議這個最大比率為 2.4(12:5)

  • 在 Android 8.0(API 26)及更高版本中,我們可以在 <activity> 標簽中使用 android:MaxAspectRatio 來聲明其支持的屏幕最大寬高比。比如我們可以聲明最大寬高比為 2.4:
<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<activity android:maxAspectRatio="2.4">
 ...
</activity>
  • 對于Android 7.1及更低版本,我們可以在 <application> 元素中添加名為 android.max_aspect 的 <meta-data> 元素,如下所示:
<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<meta-data android:name="android.max_aspect" android:value="2.4" />

注意:如果設置了最大寬高比,請不要忘記也設置 android:resizeableActivity false。否則,最大寬高比無意義。

這是因為從 Android 7.0 開始,應用的多窗口模式變?yōu)槟J啟動。在多窗口模式下,默認你的應用已經(jīng)進行了全面屏適配,如果我們不想應用在多窗口模式下運行,可以修改以下屬性:

android:resizeableActivity="false"

3. 適配凹形屏幕

Google 為劉海屏顯示方式提供了三種顯示模式:

// 默認情況,全屏頁面不可用劉海區(qū)域,非全屏頁面可以進行使用
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
// 允許頁面延伸到劉海區(qū)域
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1;
// 不允許使用劉海區(qū)域
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;

我們可以通過下面兩種方式來指定應用在凹形屏幕的顯示模式:

  • 在主題中加入android:windowLayoutInDisplayCutoutMode 屬性指定顯示模式:
// value-v28/styles.xml
 <style name="AppTheme.Launcher" parent="AppTheme">
        <item name="android:windowBackground">@drawable/branded_launch_screens</item>
        <item name="android:statusBarColor">@color/colorPrimary</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
  • 通過在代碼中指定 Activity 的顯示模式

我們可以在 Activity 的 onCreate 中指定凹形屏幕的顯示模式:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= 28) {
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            getWindow().setAttributes(lp);
        }
}

最終效果:

適配后的啟動界面
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容