沉浸式状态栏

状态栏透明方法:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

    或

  <item name="android:windowTranslucentStatus">true</item>

第一种方法是在代码中设置,在setContentView()之前设置。

第二种方法在Activity的主题Theme文件中设置。

这两种方法更多的用户4.4版本的沉浸式状态栏效果,其主要是将状态栏的颜色设置为透明,自动将当前窗口内的布局整体上移一个statusbar的高度。所以,在4.4版本上做沉浸式,需要单独增加一个状态栏高度的view,用来占位。但是这种思路的方案在6.0上也能够实现。有两种方案:

方案一

private void sinkStatusBar1() {
        // 在4.4开始,通过设置windowTranslucentStatus来透明话状态栏
        // 或者在style中通过设置"android:windowTranslucentStatus"为true来设置
        // 但是,仅仅设置该属性, 应用标题栏和状态栏重叠了,相当于整个布局上移了StatusBar的高度。
        // 下属方案是直接在content布局部分顶部增加一个占位组件,高度与statusbar高度相同
        // 6.0上也可直接运行
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        ViewGroup rootView =
                (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
        int count = rootView.getChildCount();
        //判断是否已经添加了statusBarView
        if (count > 0 && rootView.getChildAt(0) instanceof FakeStatusBarView) {
            rootView.getChildAt(0).setBackgroundColor(calculateStatusBarColor());
        } else {
            FakeStatusBarView statusBarView = createFakeStatusBar();
            rootView.addView(statusBarView, 0);
        }
//        }
    }

方案二

private void sinkStatusBar2() {
        // 在4.4开始,通过设置windowTranslucentStatus来透明话状态栏
        // 或者在style中通过设置"android:windowTranslucentStatus"为true来设置
        // 但是,仅仅设置该属性, 应用标题栏和状态栏重叠了,相当于整个布局上移了StatusBar的高度。
        // 下述方案是直接在DecorView布局部分最后增加一个占位组件,高度与statusbar高度相同
        // 6.0上也可直接运行
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //获取windowphone下的decorView
        ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
        int       count     = decorView.getChildCount();
        //判断是否已经添加了statusBarView
        if (count > 0 && decorView.getChildAt(count - 1) instanceof FakeStatusBarView) {
            decorView.getChildAt(count - 1).setBackgroundColor(calculateStatusBarColor());
        } else {
            //新建一个和状态栏高宽的view
            FakeStatusBarView statusView = createFakeStatusBar();
            decorView.addView(statusView);
        }
        ViewGroup rootView = (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
        //rootview不会为状态栏留出状态栏空间
        ViewCompat.setFitsSystemWindows(rootView,true);
        rootView.setClipToPadding(true);
//        }
    }
两种方案的区别,一个是在DecorView节点下增加一个占位View。而方案一是直接在DecorView的content布局节点内增加一个占位View。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值