Android 刘海屏 适配主要有三种方案android
在该模式下,若是当前应用没有设置页面全屏显示,则显示逻辑,与正常状况同样api
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notch);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
window.setAttributes(params);
}
}
复制代码
若是当前应用已设置页面全屏显示,则整个内容区域下移,下移高度为 刘海的高度bash
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_notch);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowManager.LayoutParams params = window.getAttributes();
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
window.setAttributes(params);
}
}
复制代码
在该模式下,内容不会延伸到刘海区ide
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notch);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
window.setAttributes(params);
}
}
复制代码
在该模式下,容许内容延伸进刘海区布局
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notch);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
window.setAttributes(params);
}
}
复制代码
图中顶部为默认状态栏的颜色,这时候须要将页面设置沉浸式,从而让用户内容充满屏幕ui
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notch);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
window.setAttributes(params);
}
ImmersionUtil.setImmersive(this);
}
复制代码
/**
* 设置Activit沉浸式
*/
public static void setImmersive(Activity activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT || activity == null) {
//Android4.4 之前不支持 沉浸式
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏颜色透明
window.setStatusBarColor(Color.TRANSPARENT);
int visibility = window.getDecorView().getSystemUiVisibility();
//布局内容全屏展现
visibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
//隐藏虚拟导航栏
visibility |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
//防止内容区域大小发生变化
visibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
window.getDecorView().setSystemUiVisibility(visibility);
} else {
//Android 5.0之前
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
}
复制代码
在具体页面显示上,须要动态获取刘海屏的高度进行设置,通常状况下,刘海的高度 就是状态栏的高度this
/**
* 获取状态栏高度
*/
public static int getStatusBarHeight(Context context) {
int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
return context.getResources().getDimensionPixelSize(resId);
}
return 0;
}
复制代码
可是在华为手机上,华为官方文档提供了获取刘海高度的方法spa
/**
* 获取华为刘海尺寸:width、height,int[0]值为刘海宽度 int[1]值为刘海高度。
*/
@SuppressWarnings("unchecked")
private static int[] getNotchSizeAtHuaWei(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 (ClassNotFoundException e) {
Log.e("test", "getNotchSize ClassNotFoundException");
} catch (NoSuchMethodException e) {
Log.e("test", "getNotchSize NoSuchMethodException");
} catch (Exception e) {
Log.e("test", "getNotchSize Exception");
}
return ret;
}
复制代码
注:Android 刘海屏 适配使用的是 Andorid 9.0后,谷歌官方提供的api,不排除 国内个别厂商 没有遵循 谷歌规范,从而致使 适配失败的状况。 (附上:个别厂商开发文档地址)3d