maxAspectRatio
根據(jù)谷歌兼容性(CTS)標(biāo)準(zhǔn)要求,應(yīng)用必須按以下方式中的任意一種蔗包,在AndroidManifest.xml中配置方可全屏顯示卖丸,否則將以非全屏顯示笛求。
方式一:配置支持最大高寬比
* <meta-data android:name="android.max_aspect" android:value="ratio_float" />
* android:maxAspectRatio="ratio_float" (API LEVEL 26)
說明:以上兩種接口可以二選一,ratio_float = 屏幕高 / 屏幕寬 (如oppo新機(jī)型屏幕分辨率為2280 x 1080材蛛, ratio_float = 2280 / 1080 = 2.11贰您,建議設(shè)置 ratio_float為2.2或者更大)
方式二:支持分屏,注意驗證分屏下界面兼容性
android:resizeableActivity="true"
建議采用方式二適配支持全面屏揍拆。
詳見官方文檔:https://source.android.google.cn/compatibility/cdd?hl=zh-cn
重要提醒
- 如果應(yīng)用要支持分屏功能渠概,則直接采用方式二,既支持了分屏嫂拴,又適配和兼容了全面屏播揪;
- 如果應(yīng)用不支持分屏功能,設(shè)置了android:resizeableActivity="false" 筒狠,則必須采用方式一來適配全面屏猪狈,否則會出現(xiàn)如下問題:
全面屏不適配出現(xiàn)的問題
底部虛擬導(dǎo)航欄可能會透明或者是黑色的,原因是因為app的布局最大比例不夠辩恼,不能夠自動適配,如下圖:
所以當(dāng)視頻播放器全屏的時候雇庙,會看有右邊圈出的部分有間隔,無法鋪滿全屏
如果代碼中設(shè)置之后,則能自動鋪滿全屏灶伊,不會透明或者預(yù)留間距:
<meta-data
android:name="android.max_aspect"
android:value="2.2" />
看如下效果圖:
Android P全面屏適配
// 谷歌官方提供的默認(rèn)適配劉海屏
WindowManager.LayoutParams lp =getWindow().getAttributes();
lp.layoutInDisplayCutoutMode=WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
getWindow().setAttributes(lp);
// 窗口聲明使用劉海區(qū)域
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS = 1;
// 默認(rèn)情況下疆前,全屏窗口不會使用到劉海區(qū)域,非全屏窗口可正常使用劉海區(qū)域
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
// 聲明不使用劉海區(qū)域
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;
Android P獲取劉海高度
劉海屏的凹槽聘萨,就在屏幕的中間竹椒,所以只有g(shù)etSafeInsetTop()方法返回的結(jié)果,是我們需要的米辐,其他的正常返回0
class WindowInsets {
DisplayCutout getDisplayCutout();
}
class DisplayCutout {
int getSafeInsetLeft();
int getSafeInsetTop();
int getSafeInsetRight();
int getSafeInsetBottom();
Region getBounds();
}
華為手機(jī)適配
官網(wǎng)地址:https://mini.eastday.com/bdmip/180411011257629.html
//判斷是否是華為劉海屏
public static boolean isHuaweiScreenHasGroove(Context context) {
boolean ret = false;
try {
ClassLoader cl = context.getClassLoader();
Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil");
Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen");
ret = (boolean) get.invoke(HwNotchSizeUtil);
} catch (Exception e) {
} finally {
return ret;
}
}
//獲取華為劉海的高寬
public static int[] getHuaweiNotchSize(Context context) {
int[] ret = new int[]{0, 0};
try {
ClassLoader cl = context.getClassLoader();
Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil");
Method get = HwNotchSizeUtil.getMethod("getNotchSize");
ret = (int[]) get.invoke(HwNotchSizeUtil);
} catch (Exception e) {
} finally {
return ret;
}
}
Oppo劉海適配
官網(wǎng)地址:https://open.oppomobile.com/wiki/doc#id=10159
//判斷手機(jī)是否有劉海
public static boolean isOppoScreenHasGroove(Context context) {
boolean isHasGroove = context.getPackageManager().hasSystemFeature("com.oppo.feature.screen.heteromorphism");
return isHasGroove;
}
劉海高度固定:80px
VIVO手機(jī)劉海適配
官網(wǎng)地址:https://dev.vivo.com.cn/doc/document/info?id=103
//判斷是否是voio劉海屏
public static final int NOTCH_IN_SCREEN_VOIO = 0x00000020;//是否有凹槽
public static final int ROUNDED_IN_SCREEN_VOIO = 0x00000008;//是否有圓角
public static boolean isVoioScreenHasGroove(Context context) {
boolean ret = false;
try {
ClassLoader cl = context.getClassLoader();
Class FtFeature = cl.loadClass("com.util.FtFeature");
Method get = FtFeature.getMethod("isFeatureSupport", int.class);
ret = (boolean) get.invoke(FtFeature, NOTCH_IN_SCREEN_VOIO);
} catch (Exception e) {
} finally {
return ret;
}
}
四周圓角高度:25dp
劉海高度:27dp
狀態(tài)欄高度:32dp