1.今天在项目中遇到刘海屏适配问题,这边总结一下这次学习到的东西
1.首先是 window layoutInDisplayCutoutMode 属性:
用法:
WindowManager.LayoutParams lp = window.getAttributes(); lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
总共是三个参数选项:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT:默认情况下,全屏窗口不会使用到刘海区域,非全屏窗口可正常使用刘海区域。
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS:窗口声明使用刘海区域
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER:窗口声明不使用刘海区域
2.判断当前是否有刘海屏的方法:
public static DisplayCutoutCompat getDisplayCutout(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowInsets windowInsets = view.getRootWindowInsets();
if (windowInsets != null) {
DisplayCutout displayCutout = windowInsets.getDisplayCutout();
if (displayCutout != null) {
Rect safeInsets = new Rect(displayCutout.getSafeInsetLeft(),
displayCutout.getSafeInsetTop(),
displayCutout.getSafeInsetRight(),
displayCutout.getSafeInsetBottom());
return new DisplayCutoutCompat(safeInsets, displayCutout.getBoundingRects());
}
}
}
return null;
}
}
用这个方法可以判读当前是否有刘海屏
但是这边有一个坑:当我们lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 这边参数设置为never的时候
再去判断是否有刘海屏幕就会返回空。
3.如何获得stateBar的高度
public static int getStatusBarHeight(@NonNull Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
用这个方法可以获得statusBar的高度,当我们设置从刘海屏上面开始布局的时候,可以通过这个方法获取刘海屏的高度,来设置布局的偏移,避免View被刘海上面的东西切割
本文总结了在Android P中处理刘海屏适配的问题,包括window的layoutInDisplayCutoutMode属性的三种模式,判断刘海屏的方法及其潜在陷阱,以及获取状态栏高度以避免视图被切割的技巧。
1361

被折叠的 条评论
为什么被折叠?



