首先,低版本的Anroid系统并不支持状态栏颜色的修改,本文运行的代码都是在5.x系统上测试的。所以确保你的Android系统在5.0及以上版本,对应的SDK版本应在21及以上。
有两种方法可以改变系统状态栏的颜色:
1、主题中设置windowTranslucentStatus
属性
2、代码中调用方法: setStatusBarColor()
【第一种】主题中设置:
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
如果设置了windowTranslucentStatus
属性为true,则状态栏会变成半透明状态
【第二种】,5.0以上系统提供了setStatusBarColor()去设置状态栏颜色
public class statusBarTest extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.statusbar);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
Window window = getWindow();// 获取当前显示的界面
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.GREEN);// 设置颜色
}
}
创建活动,在活动获得焦点时设置状态栏颜色。运行上面的代码,你可能会发现,设置的状态栏颜色没有生效。因为刚刚在主题里设置了windowTranslucentStatus属性,设置了这个属性以后,代码里的setStatusBarColor()是不会有效果的。如果想设置更多颜色样式的状态栏,那就把这个属性去掉(因为这个属性只能实现状态栏的半透明样式)。如果不想删除这个属性也可以,那就在代码中清除一下这个属性即可,修改如下:
public void onWindowFocusChanged(boolean hasFocus) {
Window window = getWindow();// 获取当前显示的界面
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);// 清除主题中设置的windowTranslucentStatus属性
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.GREEN);
}
重新运行代码,效果就出来了。
如果想让状态栏的颜色更加好看,也支持自定义颜色的使用。
由于项目的需要,对颜色的自定义稍微研究了一下。颜色的自定义是通过RGB三原色和一个alpha值来实现的。如果没有设置alpha值,那么默认是不透明的。
【方法一】:在xml资源文件中自定义颜色,然后通过id来调用。
形式是以井号(#)开始,后面是Alpha-Red-Green-Blue的格式。一般有四种形式:
#RGB
#ARGB
#RRGGBB
#AARRGGBB
比如用 #RGB 和 #RRGGBB 两种形式表示白色:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white1">#FFF</color>
<color name="white2">#FFFFFF</color>
</resources>
#FFF 和 #FFFFFF 效果是一样的。不过习惯上一般使用的是 #RRGGBB 或者 #AARRGGBB 的形式。
【方法二】:在代码中直接自定义颜色
通过工具类 Color.java 的两个方法: rgb() 和 argb()
同样是由三原色原理来完成的。
以黑色为例:
public void onWindowFocusChanged(boolean hasFocus) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.argb(0x99,0x00,0x00,0x00));// 图左效果
//window.setStatusBarColor(Color.rgb(0x00,0x00,0x00)); // 图右效果
}
图左设置了透明度,图右没有设置透明度,效果如下:
更多颜色通过三原色原理自由组合就可以了。