沉浸式模式和沉浸式状态栏
今天看郭大神的博客,把沉浸式状态栏的说法批评的一塌糊涂,所以特地记录一下,用来警示。
android系统自己定义的标准的沉浸式模式很简单,只有一个屏幕,actionbar,statusbar,navigationbar全都隐藏起来,界面默认情况下是全屏的,状态栏和导航栏都不会显示。
而当我们需要用到状态栏或导航栏时,只需要在屏幕顶部向下拉,或者在屏幕右侧向左拉,状态栏和导航栏 就会显示出来,此时界面上任何元素的显示或大小都不会受影响。
过一段时间后如果没有任何操作,状态栏和导航栏又会自动隐藏起来,重新回到全屏状态。 比较适合游戏和视频播放界面使用 重写 onWindowFocusChanged() 这个方法就可以了,不需要调用。
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19){
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|View.SYSTEM_UI_FLAG_FULLSCREEN
|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
);
}
}
正常App使用到沉浸式,是透明statusBar,透明navigationBar,隐藏ActionBar这种模式。实现方法:
先在onCreate()方法中得到decorView,隐藏ActionBar:
View decorView = getWindow().getDecorView(); //得到decorview,他是所有布局的父布局
int option = View.SYSTEM_UI_FLAG_FULLSCREEN //设置全屏的意思
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE //此flag需要配合 上一个flag一起使用 ,表示会让应用的主体内容占用系统状态栏的空间,最后再调用Window的setStatusBarColor()方法将状态栏设置成透明色就可以了,21以上的sdk才有此效果,实现透明状态栏
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
; //隐藏导航栏,不能单独使用 如果只隐藏导航栏也需要配合 View.SYSTEM_UI_FLAG_LAYOUT_STABLE
此flag一起使用, getWindow().setNavigationBarColor(Color.TRANSPARENT);这是透明的导航栏。
decorView.setSystemUiVisibility(option);
ActionBar actionBar = getSupportActionBar();
getWindow().setNavigationBarColor(Color.TRANSPARENT);
getWindow().setStatusBarColor(Color.TRANSPARENT);
actionBar.hide();
以上代码就可以实现我们正常需要的透明状态栏,透明导航栏的效果。