android 沉浸式状态栏与刘海屏适配

852 阅读1分钟

沉浸式

//沉浸式

//沉浸式 内容显示在状态栏与导航栏下面
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setStatusBarColor(Color.TRANSPARENT);
    getWindow().setNavigationBarColor(Color.TRANSPARENT);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_FULLSCREEN);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
 //全屏沉浸式 隐藏状态栏与导航栏(手势可以暂时显示状态栏与导航栏)
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     getWindow().setStatusBarColor(Color.TRANSPARENT);
     getWindow().setNavigationBarColor(Color.TRANSPARENT);
     getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
     getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN);
 } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
 }
 //全屏沉浸式 隐藏导航栏(显示状态栏,但内容显示到到横栏下面)
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     getWindow().setStatusBarColor(Color.TRANSPARENT);
     getWindow().setNavigationBarColor(Color.TRANSPARENT);
     getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
     getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
 } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
 }

属性配置

  • View.SYSTEM_UI_FLAG_FULLSCREEN 隐藏整个状态栏 (手势下拉时,会显示出来且不会再隐藏)

  • View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 内容延伸到状态栏,不隐藏状态栏

  • View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 隐藏整个导航栏

  • View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 内容延伸到导航栏,不隐藏导航栏

  • View.SYSTEM_UI_FLAG_LAYOUT_STABLE 稳定内容,不让内容随状态栏和导航栏的显示隐藏而变动大小

  • View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 粘性沉浸式,手势可以暂时展示出来隐藏的状态栏与导航栏,过段时间会自动隐藏,不会对内容布局产生影响,很适合开屏页

适配刘海屏

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    //适配刘海屏
    WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
    layoutParams.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
    getWindow().setAttributes(layoutParams);
}