Android沉浸式SYSTEM_UI_FLAG_XXX讲解

Android应用中经常会有一些要求全屏显隐状态栏导航栏的需求。通过全屏沉浸式的处理可以让应用达到更好的显示效果。下面系统的讲解一下有关全屏,隐藏状态栏导航栏,沉浸式的知识。

获取状态栏高度

新建一个StatusBarUtils.java文件,在里面添加一个获取状态栏高度的方法,以后我们都会用的到这个方法。之后我们的核心代码也在这个工具类里实现。代码如下:

public class StatusBarUtils {

    public static int getHeight(Context context) {
        int statusBarHeight = 0;
        try {
            int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen",
                    "android");
            if (resourceId > 0) {
                statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return statusBarHeight;
    }
    
}

设置全屏

在Android4.1以及更高版本可以使用setSystemUiVisibility来控制SystemUI,为了更系统的讲解,不分别按照效果来讲,而是把用到的flag先列出来一起讲。以下flag经过互相组合能达到全屏隐藏状态栏,全屏隐藏导航栏,全屏显示状态栏导航栏等很多不同效果。

控制SystemBar相关:

  • SYSTEM_UI_FLAG_FULLSCREEN
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION
  • SYSTEM_UI_FLAG_LOW_PROFILE

布局相关:

  • SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  • SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
  • SYSTEM_UI_FLAG_LAYOUT_STABLE

沉浸式相关 (4.4 引入):

  • SYSTEM_UI_IMMERSIVE
  • SYSTEM_UI_IMMERSIVE_STICKY

控制 SystemBar 相关

SYSTEM_UI_FLAG_FULLSCREEN

该属性是用来隐藏状态栏的。

 public static void hideStatusBar(@NonNull Window window, @ColorInt int color) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            int uiOption=View.SYSTEM_UI_FLAG_FULLSCREEN;
            //调用该方法,状态栏将变成隐藏,状态栏将变成纯黑色
            window.getDecorView().setSystemUiVisibility(uiOption);
        }
    }

效果图如下,注意看顶部状态栏

SYSTEM_UI_HIDE_NAVIGATION

该属性是用来隐藏导航栏的,

  • 点击任意布局中的任意位置都会导致导航栏导航栏重新显示出来
  • 并且布局也会随着状态栏导航栏的显隐进行布局调整进行重绘。
    public static void hideNavigationBar(@NonNull Window window, @ColorInt int color) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            int uiOption = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            window.getDecorView().setSystemUiVisibility(uiOption);
        }
    }

效果图如下,注意看底部导航栏

SYSTEM_UI_LOW_PROFILE

这个属性的能力是让SystemBar在视觉上变得模糊,重要性变得更低一点。具体表现是状态栏图标仅保留电量时间关键图标,并且变暗。导航栏图标变成三个点或者变暗。这个flag使用的很少。

View decorView = getWindow().getDecorView();
int uiOption = View.SYSTEM_UI_FLAG_LOW_PROFILE;
decorView.setSystemUiVisibility(uiOption);

布局相关

在新的Android4.1以及之后新的SystemUI设置里,仅单独设置隐藏状态栏和导航栏的flag会导致布局重绘,为了在显隐状态栏和导航栏的时候保持布局的稳定的显示效果,就需要以下属性了。

SYSTEM_UI_FLAG_LAYOUT_STABLE

该flag的作用是保持布局稳定,避免在显隐状态栏导航栏的时候发生布局的变化。可以辅助以下SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN、SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION两个flag的使用,让应用保持全屏的情况下,布局不随状态栏导航栏显隐发生变化。也可以不配合这两个flag使用,也能达到保持布局稳定的效果,不过不能实现全屏,会留出状态栏和导航栏的位置。

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

可以让布局延伸到状态栏的位置。在状态栏在隐藏和显示之前切换的时候,布局稳定的显示在状态栏后面(如果显示状态栏则布局在状态栏后面,隐藏状态栏布局也不变)。

  • 当滑动systembar、点击home键menu键就会清除掉flag。状态栏会重新显示出来
  • 布局不会随着状态栏的显隐进行调整变化

SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

可以让布局延伸到导航栏的位置。可以让导航栏在隐藏和显示之前切换的时候,布局稳定的显示在导航栏后面(如果显示导航栏则在导航栏后面,隐藏导航栏也不变)。

  • 点击任意布局就会清除掉flag。状态栏导航栏会重新显示出来
  • 布局不会随着状态栏导航栏的显隐进行调整变化。

参考链接

Android沉浸式全屏讲解(状态栏、导航栏处理)

从0到1优雅实现沉浸式状态栏

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值