美文网首页开发百宝箱
状态栏沉浸模式

状态栏沉浸模式

作者: boyrt | 来源:发表于2018-06-26 17:50 被阅读66次

    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

    相关文章

      网友评论

        本文标题:状态栏沉浸模式

        本文链接:https://www.haomeiwen.com/subject/emcpyftx.html