关于APP设置全屏的问题,之前陆续看过一些知识点,但是一直没有好好理解设置全屏的各个flag的含义,总是试着排列组合这些flag,看看哪个组合能符合要求就用哪个。现在将这个知识点整理下,形成一个统一的概念。
APP设置全屏,分为两个部分:隐藏状态栏 和 隐藏导航栏。
状态栏和导航栏统称为 系统栏
为了更好的说明全屏的设置,本文从四个方面来表述。
一,调暗系统栏
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
设置此标志之后,进入该Activity,状态栏就会变暗,效果如下。
在状态栏变暗之后,点击状态栏,就会退出此模式,状态栏上的Icon正常显示出来。如需再次显示此效果,需要重新设置此标志。
二,隐藏状态栏
相关FLLAG:
- View.SYSTEM_UI_FLAG_FULLSCREEN
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- View.SYSTEM_UI_FLAG_LAYOUT_STABLE
隐藏状态栏有两种方式:
第一种方式是: Manifest配置
配置APP的主题:
<style name="AppTheme" parent="android:Theme.Holo.NoActionBar.Fullscreen">
第二种方式: java代码配置
2.1 SYSTEM_UI_FLAG_FULLSCREEN + 有ActionBar ===>无论是否拉出状态栏,ActionBar和内容的位置均不变化(相当于没有全屏)
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
从状态栏顶部下拉,会将状态栏拉出来。
2.2 SYSTEM_UI_FLAG_FULLSCREEN + 隐藏ActionBar ===>无论是否拉出状态栏,ActionBar均不现实,内容的位置均不变化
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
getActionBar().hide();
2.3 View.SYSTEM_UI_FLAG_FULLSCREEN + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + 有ActionBar ==>默认不显示ActionBar,从顶部下拉,下拉栏和ActionBar均显示出来,并且 内容会显示在状态栏后面
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
2.4 View.SYSTEM_UI_FLAG_FULLSCREEN + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + 隐藏ActionBar ==>默认不显示ActionBar,从顶部下拉,下拉栏显示出来,并且 内容会显示在状态栏后面
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getActionBar().hide();
SYSTEM_UI_FLAG_LAYOUT_STABLE 官方解释:来帮助您的应用保持稳定布局。
本地尝试,无论是否添加此flag,不影响效果
2.5 在2.4的基础上添加关于水滴屏的适配,设置DisplayCutoutMode ,即应用内容是否可以显示到属地区域(默认为LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT)
WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
layoutParams.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
getWindow().setAttributes(layoutParams);
三,隐藏导航栏
相关FLLAG:
- View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
- View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
3.1 SYSTEM_UI_FLAG_HIDE_NAVIGATION + 有ActionBar
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
3.2 SYSTEM_UI_FLAG_HIDE_NAVIGATION + 隐藏ActionBar
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
getActionBar().hide();
3.3 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + 有ActionBar
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
3.4 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + 隐藏ActionBar
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
getActionBar().hide();
四,启用全屏模式
4.1 向后倾斜模式:适用于用户不会与屏幕进行大量互动的全屏体验,例如在观看视频时。(点击屏幕任意位置,都会将状态栏和导航栏调出来)
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
4.2 沉浸模式:适用于用户将与屏幕进行大量互动的应用。示例包括游戏、查看图库中的图片或者阅读分页内容,如图书或演示文稿中的幻灯片。 当用户需要调出系统栏时,他们可从隐藏系统栏的任一边滑动。要求使用这种这种意图更强的手势是为了确保用户与您应用的互动不会因意外轻触和滑动而中断。(只有从屏幕上下边缘滑动才能调出系统栏)
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE);
4.3 粘性沉浸模式:如果用户从隐藏了系统栏的边缘滑动,系统栏会显示出来,但它们是半透明的,并且轻触手势会传递给应用,因此应用也会响应该手势。无互动几秒钟后,或者用户在系统栏之外的任何位置轻触或做手势时,系统栏会自动消失。(只有从屏幕上下边缘滑动才能调出系统栏,系统栏显示时,点击屏幕任意位置即可隐藏系统栏)
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
注意:当您使用 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 标记时,滑动操作会使系统界面暂时以半透明状态显示,但不会清除任何标记,并且不会触发系统界面可见性更改监听器。