沉浸式就是利用系统状态栏,将背景图片延伸至系统状态栏区域内,效果就是和游戏应用画面那样。
Action1 隐藏状态栏和ActionBar
仅仅是隐藏状态栏和ActionBar,只是粗暴的隐藏了而已
//获取当前界面的DecorViewView decorView = getWindow().getDecorView();//表示全屏,即隐藏状态栏int option = View.SYSTEM_UI_FLAG_FULLSCREEN;//设置系统UI元素可见性decorView.setSystemUiVisibility(option);ActionBar actionBar = getSupportActionBar();//隐藏ActionBaractionBar.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