今天 Google 正式發(fā)布了 Android 9 Pie,所以也著手把應(yīng)用的 Target Version 升級(jí)到 API 28胎源,現(xiàn)在凹口屏 (又稱 "劉海屏") 的 Android 手機(jī)越來越多愧杯,Google 也是為了滿足各手機(jī)廠商這個(gè)發(fā)展趨勢(shì)提供了相應(yīng)的 API椎组。
我們可以參考 Google 的這篇 Android P 凹口屏支持培愁,打造全面屏體驗(yàn)
提到的凹口屏幕適配方案凉倚。也可以請(qǐng)查閱官方文檔《屏幕缺口支持指南》坊饶,了解適配過程中可能遇到的問題以及相應(yīng)解決方案却桶。
我們先來看看我的應(yīng)用在沒有適配凹口屏?xí)r的啟動(dòng)界面:
應(yīng)用界面上方存在一條大黑邊:
下面就來說說我在實(shí)際適配凹口屏 Android 手機(jī)的過程:
1. 開啟顯示凹口模式
如果你沒有凹口屏的真機(jī)碱呼,也可以在非凹口屏 P 版本手機(jī)或者 Android 模擬器中蒙挑,開啟 "模擬具有凹口的顯示屏" 的設(shè)置項(xiàng),然后再進(jìn)行調(diào)試愚臀。
2. 適配長(zhǎng)屏幕的全面屏
我們首先要確保應(yīng)用在長(zhǎng)屏幕設(shè)備上 (縱橫比大于或等于 18:9) 也能夠正常運(yùn)行忆蚀,尤其是現(xiàn)在市面上長(zhǎng)屏手機(jī)越來越多,而且這些設(shè)備往往同時(shí)還采用了凹口屏設(shè)計(jì)姑裂。
當(dāng)我們的應(yīng)用布局無法適應(yīng)任意大的寬高比馋袜,可以通過設(shè)置最大寬高比來聲明,Google 建議這個(gè)最大比率為 2.4(12:5)
- 在 Android 8.0(API 26)及更高版本中舶斧,我們可以在 <activity> 標(biāo)簽中使用
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>
- 對(duì)于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" />
注意:如果設(shè)置了最大寬高比泽台,請(qǐng)不要忘記也設(shè)置
android:resizeableActivity false
什荣。否則,最大寬高比無意義怀酷。
這是因?yàn)閺?Android 7.0 開始稻爬,應(yīng)用的多窗口模式變?yōu)槟J(rèn)啟動(dòng)。在多窗口模式下蜕依,默認(rèn)你的應(yīng)用已經(jīng)進(jìn)行了全面屏適配桅锄,如果我們不想應(yīng)用在多窗口模式下運(yùn)行,可以修改以下屬性:
android:resizeableActivity="false"
3. 適配凹形屏幕
Google 為劉海屏顯示方式提供了三種顯示模式:
// 默認(rèn)情況样眠,全屏頁面不可用劉海區(qū)域友瘤,非全屏頁面可以進(jìn)行使用
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;
我們可以通過下面兩種方式來指定應(yīng)用在凹形屏幕的顯示模式:
- 在主題中加入
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);
}
}
最終效果: