Android 状态栏配色详解

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

目录:

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

隐藏 ActionBar

隐藏 ActionBar 的效果

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

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

  • 方法二
    在 setContentView() 之调用

    1
    requestWindowFeature(Window.FEATURE.NO_TITLE)

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

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

继承自 AppCompatActivity 有效果

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


隐藏状态栏

隐藏了状态栏和 ActionBar

隐藏了状态栏和 ActionBar
  • 方法一

    1
    2
    3
    4
    5
    private void hideStatusBar(){
    View decorView = getWindow().getDocorView()
    int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(option);
    }
  • 方法二
    在 setvContentView() 之后

    1
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  • 方法三

    1
    android:theme=“@android:style/Theme.NoTitleBar.Fullscreen”


半透明效果的状态栏

5.0 的半透明效果

5.0 的半透明效果

4.0 的半透明效果
4.0 的半透明效果

- 方法一

1
<item name=“android.windowTranslucentStatus”>true</item>


- 方法二

1
2
3
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {                
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}




# 透明效果状态栏
状态栏与 Activity 的背景颜色相同
5.0 状态栏与 Activity 的背景颜色相同
5.0 状态栏与 Activity 的背景颜色相同

1
2
3
4
5
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)
}


注意
1
<item name="android:windowTranslucentStatus">false</item>


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

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

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

Toolbar 的 xml 代码
1
2
3
4
5
6
7
8
9
10
11
12
<?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 文件下添加
1
<item name="android:statusBarColor">#a6ae51</item>


5.0 自定义状态栏颜色
5.0 自定义状态栏颜色

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

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

左 5.0 右 4.4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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;
}
}

使用时,注意

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

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

1
StatusBarCompat.compat(this);

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

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





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

欢迎关注我的博客简书CSDNGitHub