沉浸式就是利用系统状态栏,将背景图片延伸至系统状态栏区域内,效果就是和游戏应用画面那样。
Action1 隐藏状态栏和ActionBar
仅仅是隐藏状态栏和ActionBar,只是粗暴的隐藏了而已
//获取当前界面的DecorView
View decorView = getWindow().getDecorView();
//表示全屏,即隐藏状态栏
int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
//设置系统UI元素可见性
decorView.setSystemUiVisibility(option);
ActionBar actionBar = getSupportActionBar();
//隐藏ActionBar
actionBar.hide();
Action2 透明状态栏
透明状态栏效果:背景图片延伸,而非隐藏。需要借助其他的UI Flag,且需要判断版本
//5.0以上才支持
if (Build.VERSION.SDK_INT>=21){
View decorView = getWindow().getDecorView();
//这两个Flag结合使用,才会让应用的主体内容占据系统状态栏的空间
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
//将状态栏设置为透明色
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
至此,尚不能称为沉浸式状态栏,只能算是透明状态栏
Action3 隐藏导航栏
隐藏系统底部导航栏,需要设置UI FLAG。
缺陷:只要点击屏幕,就会退出该模式
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
decorView.setSystemUiVisibility(option);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
Action4 综上
结合3种UI Flag,已经和真正的沉浸式很接近了
//5.0以上才支持
if (Build.VERSION.SDK_INT>=21){
View decorView = getWindow().getDecorView();
//3种Flag结合使用
int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
decorView.setSystemUiVisibility(option);
//将状态栏设置为透明色
getWindow().setStatusBarColor(Color.TRANSPARENT);
//将系统底部导航栏设置为透明色
getWindow().setNavigationBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN这种UI Flag,会让应用的主体内容延伸进入系统底部导航栏的空间
最后,真正的沉浸式
游戏、视频类应用会用到沉浸式,如爱奇艺、海岛奇兵。
在使用沉浸式的Activity中重写onWindowFocusChanged方法,并设置一下UI Flag
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT>=19){
View decorView = getWindow().getDecorView();
int option = 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;
decorView.setSystemUiVisibility(option);
}
}
另外在清单文件中将该Activity设置为横屏
<activity android:name=".immersion.ImmersionActivity"
android:screenOrientation="landscape">
</activity>
此时默认情况下全屏,不显示系统底部导航栏和状态栏。横屏模式下,顶部下拉或右侧下拉,系统底部导航栏和状态栏又会重新显示。点击屏幕或等待一段时间后无操作,就会重新进入沉浸式。
感谢郭婶:https://blog.csdn.net/guolin_blog/article/details/51763825