Android setSystemUiVisibility详解

简介

本文主要讲解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);

实际效果

这里写图片描述

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

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

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;

实现效果

这里写图片描述
 

View.SYSTEM_UI_FLAG_FULLSCREEN

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

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);

实现效果

这里写图片描述
 

View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

将布局内容拓展到导航栏的后面。
代码调用

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

实现效果

这里写图片描述
 

View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

将布局内容拓展到状态的后面。
代码调用

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

实现效果

这里写图片描述
 

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;
}

 

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>

 

实现效果

    没有加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);

实现效果

这里写图片描述

对比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);

实现效果

这里写图片描述
额外补充

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

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
    );
}

总结
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值