场景
沉浸式场景,由于刘海屏,刘海位置会对内容有遮挡,为了让内容展示完全,需要对刘海屏进行适配。刘海屏 宽度、高度形状均略有差异,适配难度也比较高。
如下图,适配即处理好Notch遮挡,与耳朵区显示问题。
适配
android P
开始提供刘海屏相关api.针对android P
及以后的版本,可以使用android API
适配。 但有些厂商(小米,华为等)在android P之前(android O版本)已经支持刘海屏。
需要注意的问题:
- 沉浸式需要适配。其他不需要适配。
- 刘海的高度 不超过 状态栏的高度,可通过填充状态栏,做简单适配。
- 当应用不显示 status bar 时(如全屏游戏),不允许应用使用耳朵区,系统默认填黑。
android官方适配
android P开始支持刘海屏。
提供的常用api有:
- 获取耳朵区域
- 获取安全距离
//android P获取刘海屏区域
if (Build.VERSION.SDK_INT >= 28) {
//android P以上使用google 官方判断
View decorView = getWindow().getDecorView();
WindowInsets windowInsets = decorView.getRootWindowInsets();
if (windowInsets != null) {
DisplayCutout cutout = windowInsets.getDisplayCutout();
if (cutout != null) {
List<Rect> list = cutout.getBoundingRects();
//list rect即为刘海区域,左上角,右下角坐标
}
}
}
//android P获取获取刘海屏安全距离
if (Build.VERSION.SDK_INT >= 28){
View decorView = window.getDecorView();
WindowInsets windowInsets = decorView.getRootWindowInsets();
if (windowInsets != null) {
DisplayCutout cutout = windowInsets.getDisplayCutout();
if(cutout != null) {
//获取顶部安全距离
return cutout.getSafeInsetTop();
}
}
return 0;
}
但是,其他一些操作,官方文档中没有,例如:关闭刘海屏。这种能力需要针对机型,对接具体厂商适配。
厂商api适配
当系统版本为android O时,需要用厂商提供的api适配。
有些接口要用反射来做。例如小米,判断是否为刘海屏
/**
* 只适用于判断MIUI 是否有刘海屏
* SystemProperties.getInt("ro.miui.notch", 0) == 1;
*
* @return true,小米手机为刘海屏
*/
private static boolean hasMIUINotchInScreen() {
try {
Class<?> clz = Class.forName("android.os.SystemProperties");
Method get = clz.getMethod("getInt", String.class, int.class);
return (int) get.invoke(clz, "ro.miui.notch", -1) == 1;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
刘海屏关闭需要厂商提供的api
目前,小米和华为的手机支持,关闭刘海屏,这时会在顶部刘海屏相当高度,贴一层黑条。
/**
* 刘海屏是否关闭
* @param contentResolver ContentResolver
* @return true 刘海屏关闭
*/
public static boolean isNorchClose(ContentResolver contentResolver) {
if(isMIUI()) {
return Settings.Global.getInt(contentResolver, "force_black", 0) == 1;
} else if( isHuaWei() ) {
return Settings.Secure.getInt(contentResolver,"display_notch_status", 0) == 1;
}
return false;
}