文档章节

Android setSystemUiVisibility详解

丁佳辉
 丁佳辉
发布于 2019/01/03 11:12
字数 1051
阅读 346
收藏 1

简介

本文主要讲解setSystemUiVisibility方法中的参数各个属性标志对应的用法和实际效果。主要讲解的标志有: 
- SYSTEM_UI_FLAG_LOW_PROFILE 
- SYSTEM_UI_FLAG_HIDE_NAVIGATION 
- SYSTEM_UI_FLAG_FULLSCREEN 
- SYSTEM_UI_FLAG_LAYOUT_STABLE 
- SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
- SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
- SYSTEM_UI_FLAG_IMMERSIVE 
- SYSTEM_UI_FLAG_IMMERSIVE_STICKY

下图是没有设置任何标志时的效果。

解析

View.SYSTEM_UI_FLAG_LOW_PROFILE

设置状态栏和导航栏中的图标变小,变模糊或者弱化其效果。这个标志一般用于游戏,电子书,视频,或者不需要去分散用户注意力的应用软件。

代码调用

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
1
实际效果

从上图的效果中,我们可以看出状态栏和导航栏中相应的图标都变成了一个小点,这就达到了弱化的效果,具体变成什么效果要根据实际的机型系统版本而定。同时,点击状态栏和导航栏相应的位置,这些图标的效果会还原成正常的状态。

View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

隐藏导航栏,点击屏幕任意区域,导航栏将重新出现,并且不会自动消失。

代码调用

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
1
实现效果

View.SYSTEM_UI_FLAG_FULLSCREEN

隐藏状态栏,点击屏幕区域不会出现,需要从状态栏位置下拉才会出现。

代码调用

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
1
实现效果

View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

将布局内容拓展到导航栏的后面。

代码调用

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
1
实现效果

View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

将布局内容拓展到状态的后面。

代码调用

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
1
实现效果

View.SYSTEM_UI_FLAG_LAYOUT_STABLE

稳定布局,主要是在全屏和非全屏切换时,布局不要有大的变化。一般和View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN、View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION搭配使用。同时,android:fitsSystemWindows要设置为true。

代码调用

private void toggle() {
    if (mVisible) {
        getWindow().getDecorView().setSystemUiVisibility(
                  View.SYSTEM_UI_FLAG_LOW_PROFILE
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
    } else {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        );
    }

    mVisible = !mVisible;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:background="@drawable/bg"
    >
</FrameLayout>
1
2
3
4
5
6
7
实现效果

没有加View.SYSTEM_UI_FLAG_LAYOUT_STABLE标志的效果


加了View.SYSTEM_UI_FLAG_LAYOUT_STABLE标志的效果


通过这个上面的效果对比,可以很清楚的区分View.SYSTEM_UI_FLAG_LAYOUT_STABLE这个属性的特性了。

View.SYSTEM_UI_FLAG_IMMERSIVE

使状态栏和导航栏真正的进入沉浸模式,即全屏模式,如果没有设置这个标志,设置全屏时,我们点击屏幕的任意位置,就会恢复为正常模式。所以,View.SYSTEM_UI_FLAG_IMMERSIVE都是配合View.SYSTEM_UI_FLAG_FULLSCREEN和View.SYSTEM_UI_FLAG_HIDE_NAVIGATION一起使用的。

代码调用

getWindow().getDecorView().setSystemUiVisibility(
                  View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_IMMERSIVE);
1
2
3
实现效果

对比View.SYSTEM_UI_FLAG_HIDE_NAVIGATION的效果,可以看出来,在没有设置View.SYSTEM_UI_FLAG_IMMERSIVE时,随便点击屏幕就可以解除隐藏导航栏的状态。所以,设置View.SYSTEM_UI_FLAG_IMMERSIVE就是真正进入沉浸模式。

View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

它的效果跟View.SYSTEM_UI_FLAG_IMMERSIVE一样。但是,它在全屏模式下,用户上下拉状态栏或者导航栏时,这些系统栏只是以半透明的状态显示出来,并且在一定时间后会自动消息。

代码调用

getWindow().getDecorView().setSystemUiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
1
2
3
实现效果

额外补充

我们在设置全屏和非全屏的时候,可以通过下面的方法实现,代码如下:

if (mVisible){ //全屏
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
} else { //非全屏
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
总结

Flag    意义
SYSTEM_UI_FLAG_LOW_PROFILE    弱化状态栏和导航栏的图标
SYSTEM_UI_FLAG_HIDE_NAVIGATION    隐藏导航栏,用户点击屏幕会显示导航栏
SYSTEM_UI_FLAG_FULLSCREEN    隐藏状态栏
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION    拓展布局到导航栏后面
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN    拓展布局到状态栏后面
SYSTEM_UI_FLAG_LAYOUT_STABLE    稳定的布局,不会随系统栏的隐藏、显示而变化
SYSTEM_UI_FLAG_IMMERSIVE    沉浸模式,用户可以交互的界面
SYSTEM_UI_FLAG_IMMERSIVE_STICKY    沉浸模式,用户可以交互的界面。同时,用户上下拉系统栏时,会自动隐藏系统栏

--------------------- 
作者:qqxiaoqiang1573 
来源:CSDN 
原文:https://blog.csdn.net/QQxiaoqiang1573/article/details/79867127 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文转载自:https://blog.csdn.net/QQxiaoqiang1573/article/details/79867127

丁佳辉
粉丝 20
博文 454
码字总数 208770
作品 0
浦东
程序员
私信 提问
动态显示和隐藏状态栏(包括底部虚拟按键)

小米Launcher有一个细节上的功能效果:在长按桌面应用图标时,会隐藏状态栏,然后在状态栏原有的布局上显示卸载或删除的操作栏。放手后,操作栏隐藏,状态栏显示出来。也就是说,这个过程是涉...

不正经啊不正经
2015/07/29
4.9K
1
android P设置状态栏字体图标颜色

public void applyDark(DarkReceiver object) {} //安卓P会监听应用主题变化,亮色主题,设置字体和图标黑色, 黑色主题设置字体和图标等白色,通过onDarkChanged回调给ui。 //darkIntensit...

郑泮勇
2018/12/21
306
0
android 动态显示和隐藏状态栏

View类提供了setSystemUiVisibility和getSystemUiVisibility方法,这两个方法实现对状态栏的动态显示或隐藏的操作,以及获取状态栏当前可见性。 setSystemUiVisibility(int visibility)方法可...

Jamsm
2016/02/02
261
0
android4.1 平板隐藏System Bar

有时开发视频或游戏程序,即使设置了getWindow().getDecorView().setSystemUiVisibility(View.SYSTEMUIFLAGLOWPROFILE),一不小心触摸了底部区域的小黑点,看视频注意力会分散,游戏中断或注...

Wilber
2012/11/05
6K
4
android 4.0 全屏 屏蔽下面的status bar

做一个平板的应用,底部的BACK HOME 还有电池WIFI的那一条STATUS BAR设置全屏后怎么也去不掉, 后来发现一个比较好的方法 在OnCreate里添加一行语句 ,在setContentView之前哦: getWindow(...

雨焰
2012/07/26
10.8K
4

没有更多内容

加载失败,请刷新页面

加载更多

在JavaScript中将数字转换为字符串的最佳方法是什么?

将数字转换为字符串的“最佳”方法是什么(就速度优势,清晰度优势,内存优势等而言)? 一些例子: String(n) n.toString() ""+n n+"" #1楼 如果需要将结果格式设置为特定的小数位数 (例如...

javail
20分钟前
111
0
51单片机中断学习

一、中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原...

demyar
22分钟前
97
0
创龙TI KeyStone C66x多核定点/浮点DSP TMS320C665x 的拓展IO信号、FMC接口

广州创龙结合TI KeyStone系列多核架构TMS320C665x及Xilinx Artix-7系列FPGA设计的TL665xF-EasyEVM开发板是一款DSP+FPGA高速大数据采集处理平台,其底板采用沉金无铅工艺的6层板设计,适用于高...

Tronlong创龙
23分钟前
90
0
理解虚拟网络

概念 TUN/TAP,veth

认真即可
29分钟前
162
0
聊聊artemis的ServerConnectionLifeCycleListener

序 本文主要研究一下artemis的ServerConnectionLifeCycleListener BaseConnectionLifeCycleListener activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq/artem......

go4it
30分钟前
111
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部