美文网首页Android开发Android开发经验谈Android开发
最全!Android 开发状态栏配色详解

最全!Android 开发状态栏配色详解

作者: _Binguner | 来源:发表于2018-09-18 18:44 被阅读19次

    感觉 Android 状态栏一直是一个坑啊!!
    并且国内不同 Android 的手机厂商也对状态栏做了不同的适配和修改。在此记录以下实现不同效果的状态栏的方法

    Android 4.4 之前,Android 的状态栏是黑色背景,无法修改
    Android 4.4 推出了透明状态栏的效果。
    Android 5.0 提供了方法可以直接修改状态栏的颜色。

    目录:

    1. 隐藏 ActionBar
    2. 隐藏状态栏
    3. 半透明效果的状态栏(5.0 是半透明,4.4 是渐变)
    4. 透明效果状态栏
      (1) 状态栏与桌面背景颜色相同
      (2)状态栏与 Toolbar 背景颜色相同

    1. 隐藏 ActionBar

    隐藏 ActionBar 的效果
    • 方法一
      在 AndroidManifest.xml 中定义
    <application android:theme="@android:style/Theme.NoTitleBar”> 
    

    效果:整个项目的 Activity 都会隐藏 ActionBar

    • 方法二
      在 setContentView() 之调用
    requestWindowFeature(Window.FEATURE.NO_TITLE) 
    

    这个方法在「第一行代码」中讲到过,但是使用有一个前提:必须继承自 Activity 才有效果

    • 方法三
      在 setContentView() 之调用
    getSupportActionBar().hide(); 
    

    继承自 AppCompatActivity 有效果

    • 方法四
      重写一个 style,在其中添加
    <item name=“windowNoTitile”>true</item>
    

    2. 隐藏状态栏

    隐藏了状态栏和 ActionBar
    • 方法一
    private void hideStatusBar(){
        View decorView = getWindow().getDocorView()
        int option = View.SYSTEM_UI_FLAG_FULLSCREEN; 
        decorView.setSystemUiVisibility(option);
    }
    
    • 方法二
      在 setvContentView() 之后
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    • 方法三
    android:theme=“@android:style/Theme.NoTitleBar.Fullscreen”
    

    3. 半透明效果的状态栏

    5.0 的半透明效果
    4.0 的半透明效果
    • 方法一
    <item name=“android.windowTranslucentStatus”>true</item> 
    
    • 方法二
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {                
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
    

    4. 透明效果状态栏

    4.1 状态栏与 Activity 的背景颜色相同
    5.0 状态栏与 Activity 的背景颜色相同
    if(Build.VERSION.SDK_INT >= 21){
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        |View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        getWindow().setStatusBarColor(Color.TRANSPARENT)
    }
    

    注意

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

    android:windowTranslucentStatus 设置为 false
    不然还是半透明的效果

    有些厂商的系统就算设置成半透明效果,还是会直接显示成透明效果


    4.2 状态栏与 Toolbar 颜色相同
    5.0 状态栏与 Toolbar 颜色相同

    Toolbar 的 xml 代码

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.Toolbar
        android:id="@+id/mytoolbar"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:clipToPadding="true"
        android:minHeight="?attr/actionBarSize"
        android:paddingTop="@dimen/toolbar_padding_top"
        android:background="@color/colorToolbarBack">
    </android.support.v7.widget.Toolbar>
    

    注意:
    toolbar_padding_top 在 values-v19 下设置为 25dp,在 values-v21 下设置为 0dp
    android:fitSystemWindow=“true” 在 5.0 系统下避免 Toolbar 整体上移到状态栏的位置

    在这里补充一下 v19 和 v21的相关知识
    v19 指 values-v19,是对应api19+手机型号在此调用。
    v21 指 values-v21,是对应api21+手机型号在此调用。
    values 对应 values-v19 和 values-v21 中没有对应的属性时默认在此调用。
    要创建 values-v19 ,values-v21 需要在切换到 Project 视图下手动创建文件夹,如图:


    手动创建 values-v19 ,values-v21 文件夹

    这里做是将 Toolbar 都背景延伸到了状态栏,Android 5.0 提供了新的方法,可以直接修改状态栏的颜色
    在 v21 的 styles 文件下添加

    <item name="android:statusBarColor">#a6ae51</item>
    
    5.0 自定义状态栏颜色

    那么 4.4 版本的怎么实现这种效果呢?

    很遗憾,4.4 目前只能做到渐变层的效果
    但是根据这篇文章提供的方法,可以自定义 4.4 的状态栏颜色,尽量与 5.0 做到效果一致

    左 5.0 右 4.4
    package com.example.binguner.test;
    
    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Color;
    import android.os.Build;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class StatusBarCompat {
    
        private static final int INVALID_VAL = -1;
        private static final int COLOR_DEFAULT = Color.parseColor("#20000000");
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public static void compat(Activity activity, int statusColor)
        {
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            {
                if (statusColor != INVALID_VAL)
                {
                    activity.getWindow().setStatusBarColor(statusColor);
                }
                return;
            }
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
            {
                int color = COLOR_DEFAULT;
                ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
                if (statusColor != INVALID_VAL)
                {
                    color = statusColor;
                }
                View statusBarView = new View(activity);
                ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                        getStatusBarHeight(activity));
                statusBarView.setBackgroundColor(color);
                contentView.addView(statusBarView, lp);
            }
    
        }
    
        public static void compat(Activity activity)
        {
            compat(activity, INVALID_VAL);
        }
    
    
        public static int getStatusBarHeight(Context context)
        {
            int result = 0;
            int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceId > 0)
            {
                result = context.getResources().getDimensionPixelSize(resourceId);
            }
            return result;
        }
    }
    

    使用时,注意

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

    android:windowTranslucentStatus 设置为 true,
    否则自定义的状态栏无法覆盖到顶部
    再在 MainActivity 中

    StatusBarCompat.compat(this);
    

    或者想自定义状态栏的颜色

    StatusBarCompat.compat(this, getResources().getColor(R.color.status_bar_color));
    



    有什么问题或者补充的话欢迎各位留言 :)

    欢迎关注我的公众号,聚焦于前沿的 Android 开发技术。

    扫一扫,关注我的公众号

    相关文章

      网友评论

        本文标题:最全!Android 开发状态栏配色详解

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