开发百宝箱

状态栏沉浸模式

2018-06-26  本文已影响66人  boyrt

android4.4之前的版本,状态栏的背景色和字体颜色都不能修改。但是4.4以后Google增加了改变状态栏背景透明的方法。在6.0以后Google增加了修改字体颜色的方法。

沉浸模式

沉浸模式可理解为Activity全屏,但是状态栏覆盖显示在界面顶部。由此将存在两种需求:
(1)状态栏背景透明,覆盖在图片上
(2)状态栏背景颜色和标题栏颜色一致。

沉浸模式是针对android4.4及其以上版本进行设定。

状态栏背景透明 状态栏背景色和标题栏一致

状态栏覆盖在图片上显示,我们只需要实现全屏延伸即可。而要实现状态栏颜色和标题栏颜色一致,则只需要设置状态栏颜色即可。

1、全屏延伸

全屏延伸,核心点在于状态栏设置为透明,而状态栏设置透明必须android版本不低于4.4。
为了适配android4.4以上版本,我们需要新建values-v19和values-v21,并创建文件styles.xml。
values文件夹中的styles是适配andriod4.4以下版本,即不设置状态栏透明。

状态栏设置透明有两种实现方法,一种是通过设置主题style,另一种是通过代码实现。

1.1通过设置主题style实现

values文件夹中的styles文件:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="AppTheme.Main" parent="AppTheme"/>

values-v19文件夹中的styles文件:

    <style name="AppTheme.Main" parent="AppTheme">
        <item name="android:windowTranslucentStatus">true</item>
    </style>

values-v21文件夹中的styles文件:

    // 5.0 以上提供了 setStatusBarColor()  方法设置状态栏颜色。
    <style name="AppTheme.Main" parent="AppTheme">
        <item name="android:windowTranslucentStatus">true</item>
        <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
        <item name="android:windowTranslucentNavigation">true</item>
    </style>

android:windowTranslucentNavigation对应的是底部的虚拟键的背景。

1.2通过代码实现

    protected void setTranslucentStatus(){
        //设置5.0及其以上系统状态栏透明
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        }else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

setTranslucentStatus方法在onCreate中执行即可。
其中有一部分代码是虚拟键背景设置。

2、设置状态栏颜色(非透明)

设置状态栏颜色,android5.0以上系统可通过主题样式设置,也可通过代码设置;android4.4系统只能通过代码设置。

有些技术文档介绍的是通过设置主题style和 fitsSystemWindows 属性,从而达到android4.4系统和5.0以上系统修改状态栏颜色的目的。其实,android4.4系统并非是修改了状态栏颜色,而是现实的activity最外层的背景色。因此最外层背景色需要特别设定。个人感觉这个方法不是很实用,就记录了。毕竟怎么简单怎么来_

    protected void setStatusColor(int color){

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.0 以上直接设置状态栏颜色
            getWindow().setStatusBarColor(color);
        } else {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            ViewGroup rootView = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);
            rootView.setPadding(0, getStatusBarHeight(), 0, 0);

            //根布局添加占位状态栏
            ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
            View statusBarView = new View(this);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    getStatusBarHeight());
            statusBarView.setBackgroundColor(color);
            decorView.addView(statusBarView, lp);
        }

    }

    protected int getStatusBarHeight(){
        int result = 0;
        //获取状态栏高度的资源id
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }

onCreate方法中执行setStatusColor方法即可。

本文主要记录如何简单实现上文的两种需求,通过代码更好的理解设置的原理。

第三方库:compile 'com.jaeger.statusbarutil:library:1.4.0'

参考文档:https://www.jianshu.com/p/dc20e98b9a90

上一篇下一篇

猜你喜欢

热点阅读