说明:我尽量不打错别字,用词准确,不造成阅读障碍。
日常开发中我见过的状态栏效果只有“全透明”、“半透明”、“各种颜色”这三种了,如果是前两者,请参考我的另一篇文章 简单易懂的沉浸式状态栏使用详解(1)——状态栏全透明(含虚拟按键适配),本篇文章只讲如何简单快速无负担的达到沉浸式状态栏(颜色改变)的效果。
所有内容都是建立在Android 5.0和Android 4.4的模拟器上完成的,5.0以上的6.0和7.0、8.0都是和5.0一样的,6.0及以上可以将状态栏改成白底黑字的。
一.通过修改主题的方式(5.0及以上,5.0以下我不知道方法):
如果只是适配5.0以上的系统,因为现在国内其实大部分系统都是5.0以上的吧,这时只需要修改主题就好:
<itemname="android:statusBarColor">@android:color/transparent</item>
“@android:color/transparent”可以随便改成自己的colors文件里面的颜色,然后Manifest中设置到具体的activity中就好了。
二.通过代码的方式修改:
这种方式也是要分为5.0及以上和5.0以下的:
5.0及以上:
直接设置代码就好
getWindow().setStatusBarColor(getResources().getColor(R.color.red));
为了兼容5.0以下
private static final int FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(color);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
if (fakeStatusBarView != null) {
if (fakeStatusBarView.getVisibility() == View.GONE) {
fakeStatusBarView.setVisibility(View.VISIBLE);
}
fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
} else {
decorView.addView(createStatusBarView(activity, color, alpha));
}
}
/**
* 生成一个和状态栏大小相同的半透明矩形条
*
* @param activity 需要设置的activity
* @param color 状态栏颜色值
* @param alpha 透明值
* @return 状态栏矩形条
*/
private static View createStatusBarView(Activity activity, @ColorInt int color, int alpha) {
// 绘制一个和状态栏一样高的矩形
View statusBarView = new View(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);
return statusBarView;
}
/**
* 计算状态栏颜色
*
* @param color color值
* @param alpha alpha值
* @return 最终的状态栏颜色
*/
private static int calculateStatusColor(@ColorInt int color, int alpha) {
if (alpha == 0) {
return color;
}
float a = 1 - alpha / 255f;
int red = color >> 16 & 0xff;
int green = color >> 8 & 0xff;
int blue = color & 0xff;
red = (int) (red * a + 0.5);
green = (int) (green * a + 0.5);
blue = (int) (blue * a + 0.5);
return 0xff << 24 | red << 16 | green << 8 | blue;
}
/**
* 获取状态栏高度
*
* @param context context
* @return 状态栏高度
*/
private static int getStatusBarHeight(Context context) {
// 获得状态栏高度
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
return context.getResources().getDimensionPixelSize(resourceId);
}
总体思想与上一篇一样,就是自己写一个有颜色的view去代替状态栏,这是参考别人的代码,推荐给大家:
https://github.com/laobie/StatusBarUtil
但是我觉得,如果只是做透明或者只适配5.0及以上系统,就不用引入这个依赖了,浪费,白耗资源。
总结一下两篇文章所写的:
如果只是适配5.0及以上,不管是改成透明的还是更改具体颜色,通过两种方式:
1.修改主题
2.修改代码(代码量不大,所以很方便)
如果要适配5.0以下,就要看是只改透明的还是改具体颜色
1.如果只改透明的就可以修改主题就好,改代码也行,就是代码量挺大。
2.如果要改具体的颜色,只能通过代码修改,且代码量不小。
参考及感谢:https://github.com/laobie/StatusBarUtil