沉浸式状态栏
// 设置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 设置沉浸式
int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
int uiVisibility = window.getDecorView().getSystemUiVisibility();
uiVisibility |= flags;
window.getDecorView().setSystemUiVisibility(uiVisibility);
刘海区黑边(内容区域下挫)问题
让内容区域延伸到刘海区
WindowManager.LayoutParams params = window.getAttributes();
/**
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式,内容下移,非全屏不受影响
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允许内容区域延伸到刘海区
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允许内容延伸进刘海区
*/
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
window.setAttributes(params);
避开刘海区
// 避开刘海屏的两种方式
// 第一种: 设置布局第一个 View 的 topMargin 为状态栏的高度
// 第二种:设置布局跟View 的topPadding 为状态栏的高度
// 第一种
TextView topView = findViewById(R.id.top_view);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) topView.getLayoutParams();
layoutParams.topMargin = heightForDisplayCutout();
topView.setLayoutParams(layoutParams);
// 第二种
RelativeLayout containerView = findViewById(R.id.container);
containerView.setPadding(
containerView.getPaddingLeft(),
heightForDisplayCutout(),
containerView.getPaddingRight(),
containerView.getPaddingBottom());
适配刘海屏
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1.设置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 判断手机是否是刘海屏
boolean hasDisplayCutout = hasDisplayCutout(window);
if (hasDisplayCutout){
// 2. 让内容区域延伸到刘海区
WindowManager.LayoutParams params = window.getAttributes();
/**
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式,内容下移,非全屏不受影响
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允许内容区域延伸到刘海区
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允许内容延伸进刘海区
*/
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
window.setAttributes(params);
// 3.设置沉浸式
int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
int uiVisibility = window.getDecorView().getSystemUiVisibility();
uiVisibility |= flags; // 追加沉浸式设置
window.getDecorView().setSystemUiVisibility(uiVisibility);
}
setContentView(R.layout.layout_percent);
// 避开刘海屏的两种方式
// 第一种: 设置布局第一个 View 的 topMargin 为状态栏的高度
// 第二种:设置布局跟View 的topPadding 为状态栏的高度
// 第一种
TextView topView = findViewById(R.id.top_view);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) topView.getLayoutParams();
layoutParams.topMargin = heightForDisplayCutout();
topView.setLayoutParams(layoutParams);
// 第二种
RelativeLayout containerView = findViewById(R.id.container);
containerView.setPadding(
containerView.getPaddingLeft(),
heightForDisplayCutout(),
containerView.getPaddingRight(),
containerView.getPaddingBottom());
}
/***
* 是否是刘海屏
* @param window
* @return
*/
@RequiresApi(api = Build.VERSION_CODES.P)
private boolean hasDisplayCutout(Window window){
WindowInsets insets = window.getDecorView().getRootWindowInsets();
DisplayCutout displayCutout;
// Android 9.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && insets!=null){
displayCutout = insets.getDisplayCutout();
if (displayCutout!=null){
if (displayCutout.getBoundingRects() !=null && displayCutout.getBoundingRects().size()>0 && displayCutout.getSafeInsetTop() > 0){
return true;
}
}
}
return false;
}
/**
* 计算状态栏高度(注:通常情况下,刘海的高度就是状态栏的高度)
* @return
*/
private int heightForDisplayCutout(){
int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId>0){
return getResources().getDimensionPixelSize(resId);
}
return 96;
}