private static final int FAKE_NAVIGATION_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view;
/**
* 设置导航栏颜色
*
* @param activity 需要设置的activity
* @param color 导航栏颜色值
* @param statusBarAlpha 导航栏透明度
*/
public static void setColor(Activity activity, @ColorInt int color, @IntRange(from = 0, to = 255) int statusBarAlpha) {
if (!hasNavigationBar(activity)) {//没有导航栏直接返回
return;
}
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_NAVIGATION);
activity.getWindow().setNavigationBarColor(calculateNavigationColor(color, statusBarAlpha));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
View fakeNavigationBarView = decorView.findViewById(FAKE_NAVIGATION_BAR_VIEW_ID);
if (fakeNavigationBarView != null) {
if (fakeNavigationBarView.getVisibility() == View.GONE) {
fakeNavigationBarView.setVisibility(View.VISIBLE);
}
fakeNavigationBarView.setBackgroundColor(calculateNavigationColor(color, statusBarAlpha));
} else {
View view = createNavigationBarView(activity, color, statusBarAlpha);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(view.getLayoutParams());
params.gravity = Gravity.BOTTOM;
view.setLayoutParams(params);
decorView.addView(view);
}
}
}
/**
* 计算状态栏颜色
*
* @param color color值
* @param alpha alpha值
* @return 最终的状态栏颜色
*/
private static int calculateNavigationColor(@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 activity 需要设置的activity
* @param color 状态栏颜色值
* @param alpha 透明值
* @return 状态栏矩形条
*/
private static View createNavigationBarView(Activity activity, @ColorInt int color, int alpha) {
// 绘制一个和状态栏一样高的矩形
View statusBarView = new View(activity);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getNavigationBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(calculateNavigationColor(color, alpha));
statusBarView.setId(FAKE_NAVIGATION_BAR_VIEW_ID);
return statusBarView;
}