今天 Google 正式發(fā)布了 Android 9 Pie,所以也著手把應用的 Target Version 升級到 API 28,現(xiàn)在凹口屏 (又稱 "劉海屏") 的 Android 手機越來越多,Google 也是為了滿足各手機廠商這個發(fā)展趨勢提供了相應的 API。
我們可以參考 Google 的這篇 Android P 凹口屏支持,打造全面屏體驗
提到的凹口屏幕適配方案。也可以請查閱官方文檔《屏幕缺口支持指南》,了解適配過程中可能遇到的問題以及相應解決方案。

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

下面就來說說我在實際適配凹口屏 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);
}
}
最終效果:

