Android 实现渐变色状态栏
Posted 星火燎原2016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 实现渐变色状态栏相关的知识,希望对你有一定的参考价值。
渐变色状态栏变得越来越流行了, 刚好最近有这样的需求, 现将实现过程记录下来.
效果图:
android 5.0 以上版本(左边) : Android 4.4 以上版本(右边):
实现思路
我们都知道, 在高于 4.4 低于 5.0 版本上实现纯色状态栏, 是将状态栏透明,然后创建一个与状态栏等高的 View, 设置背景色,放在状态栏位置上即可.
现需要设置为渐变色,由于系统没有提供状态栏设置渐变色 API, 所以我们可以借鉴在 4.4 上实现纯色状态栏的思路, 只是 View 的背景设置为渐变色 Drawable 即可.
/**
* 设置状态栏 Drawable,比如渐变色
*
* @param activity
* @param drawableId
*/
public static void setDrawable(Activity activity, @DrawableRes int drawableId)
Drawable drawable = activity.getResources().getDrawable(drawableId);
setDrawable(activity, drawable);
/**
* 设置状态栏 Drawable
* @param activity
* @param drawable
*/
public static void setDrawable(Activity activity, Drawable drawable)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 去掉半透明
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 状态栏设置透明
activity.getWindow().setStatusBarColor(activity.getResources().getColor(android.R.color.transparent));
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);
// Activity 已经添加过了 statusBarView , 则修改背景颜色
if (fakeStatusBarView != null)
if (fakeStatusBarView.getVisibility() == View.GONE)
fakeStatusBarView.setVisibility(View.VISIBLE);
fakeStatusBarView.setBackground(drawable);
else // 没有添加过,则添加一个 statusBarView
// decorView 中添加一个与状态栏大小的 view
decorView.addView(createStatusBarDrawableView(activity, drawable));
setRootView(activity);
/**
* 生成一个和状态栏大小相同的矩形条,并设置背景为 drawable
*
* @param activity
* @param drawable
* @return
*/
private static View createStatusBarDrawableView(Activity activity, Drawable drawable)
// 绘制一个和状态栏一样高的矩形
View statusBarView = new View(activity);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackground(drawable);
statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);
return statusBarView;
在 Fragment / DrawerLayout 中调用和 StatusBarUtil 中 setColor() 方式一样,
调用方式:
StatusBarUtil.setDrawable(this, R.drawable.gradient_status_bg);
源码: https://github.com/xing16/ProgressAndroid 中 GradientStatusBarActivity.java
以上是关于Android 实现渐变色状态栏的主要内容,如果未能解决你的问题,请参考以下文章
如何在android中将状态栏背景设置为渐变色或drawable
iOS UIColor与16进制颜色互转,渐变色绘制以及纯色图片生成(可以半透明)