android:沉浸式状态栏(状态栏一体化)

沉浸式状态栏是从IOS流行起来的,毕竟整个界面设计的比较完美话,上面有个白条的话比较违和。然后android也慢慢流行起来。所以较早版本的android不支持沉浸式状态栏。

我们先看一下如果不设置状态栏的app界面(theme为NoActionBar):
这里写图片描述

是不是看到上面的状态栏比较违和?

样式一:

实现代码如下:

        if (Build.VERSION.SDK_INT >= 21) {
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
        // 如果theme是NoActionBar或者NoActionBar的子theme,如果添加下面两行代码会报异常
//        ActionBar actionBar = getSupportActionBar();
//        actionBar.hide();

然后我们看一下效果图,就会发现另一个问题:titleBar覆盖了状态栏
这里写图片描述

下一步我们要测量一下状态栏的高度并且设置titleBar的位置,实现代码如下:
测量状态栏的高度:

    private int getStatusBarHeight() {
        Class<?> clazz = null;
        Object obj = null;
        Field field = null;
        int x = 0;
        try {
            clazz = Class.forName("com.android.internal.R$dimen");
            obj = clazz.newInstance();
            field = clazz.getField("status_bar_height");
            x = Integer.parseInt(field.get(obj).toString());
            return getResources().getDimensionPixelSize(x);
        } catch (Exception e) {
            e.printStackTrace();
            return 75;
        }
    }

动态设置titleBar的位置:

   int statusBarHeight = getStatusBarHeight();
   Log.e("yushan", "statusBarHeight:" + statusBarHeight);
   title = (RelativeLayout)findViewById(R.id.title);
   RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) title.getLayoutParams();
   lp.topMargin = statusBarHeight;
   title.setLayoutParams(lp);

最后咱们再看一下效果图:
这里写图片描述

哒哒,现在的效果是不是看着比较舒服~当然,有少数需求会把底部导航栏也渲染成同样的背景,实现代码如下:

        if (Build.VERSION.SDK_INT >= 21) {
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            getWindow().setNavigationBarColor(Color.TRANSPARENT);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
        // 如果theme是Theme.AppCompat.Light.NoActionBar或者子theme,如果添加下面两行代码会报异常
//        ActionBar actionBar = getSupportActionBar();
//        actionBar.hide();

效果图咱们就不贴了,可以自己运行一下看看。注意:沉浸式状态栏要在android5.0以上才会实现
这里道长找了一个4.2的机子运行了一下,效果图如下:
这里写图片描述

样式二

当然还有的应用感觉状态栏也没有必要展示,比如一些视频播放类应用。实现代码如下:

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    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);
        }
    }

效果图如下:
这里写图片描述

关于沉浸式状态栏就说这么多吧,一般这么多就可以应对绝大多数需求了。希望这篇博客能够为小伙伴们提供一些帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值