比如这样的,很明显视觉效果比较low一些。我们希望statusbar和我们主题的颜色是一致的。所以就要代码修改statusbar的颜色,做到一致的效果
首先我们自定义statusbar背景色,直接贴代码
public class StatusBarCompat {
static class BaseImpl {
public void setStatusBarColor(@NonNull Activity activity, @ColorInt int statusColor) {}
public void translucentStatusBar(@NonNull Activity activity, boolean hideStatusBarBackground) {}
public void setStatusBarColorForCollapsingToolbar(@NonNull Activity activity, AppBarLayout appBarLayout, CollapsingToolbarLayout collapsingToolbarLayout, Toolbar toolbar, @ColorInt int statusColor) {}
}
static final BaseImpl IMPL;
static {
final int version = android.os.Build.VERSION.SDK_INT;
if (version >= Build.VERSION_CODES.LOLLIPOP) {
IMPL = new StatusBarCompatLollipop();
} else if (version >= Build.VERSION_CODES.KITKAT) {
IMPL = new StatusBarCompatKitKat();
} else {
IMPL = new BaseImpl();
}
}
/**
* set statusBarColor
*
* @param statusColor color
* @param alpha 0 - 255
*/
public static void setStatusBarColor(@NonNull Activity activity, @ColorInt int statusColor, int alpha) {
setStatusBarColor(activity, calculateStatusBarColor(statusColor, alpha));
}
public static void setStatusBarColor(@NonNull Activity activity, @ColorInt int statusColor) {
IMPL.setStatusBarColor(activity, statusColor);
}
public static void translucentStatusBar(@NonNull Activity activity) {
translucentStatusBar(activity, false);
}
/**
* change to full screen mode
*
* @param hideStatusBarBackground hide status bar alpha Background when SDK > 21, true if hide it
*/
public static void translucentStatusBar(@NonNull Activity activity, boolean hideStatusBarBackground) {
IMPL.translucentStatusBar(activity, hideStatusBarBackground);
}
public static void setStatusBarColorForCollapsingToolbar(@NonNull Activity activity, AppBarLayout appBarLayout, CollapsingToolbarLayout collapsingToolbarLayout,
Toolbar toolbar, @ColorInt int statusColor) {
IMPL.setStatusBarColorForCollapsingToolbar(activity, appBarLayout, collapsingToolbarLayout, toolbar, statusColor);
}
//Get alpha color
static int calculateStatusBarColor(int color, int alpha) {
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;
}
/**
* return statusBar's Height in pixels
*/
public static int getStatusBarHeight(Context context) {
//Api level 19以下,系统没有开放status bar的开放权限,返回0
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return 0;
}
int result = 0;
int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
result = context.getResources().getDimensionPixelOffset(resId);
}
return result;
}
}
public class FitStatusBarHeightView extends View { public FitStatusBarHeightView(Context context) { super(c
public class StatusBarCompat { static class BaseImpl { public void setStatusBarColor(@NonNull Activity activity, @ColorInt int statusColor) {} public void translucentStatusBar(@NonNull Activity activity, boolean hideStatusBarBackground) {} public void setStatusBarColorForCollapsingToolbar(@NonNull Activity activity, AppBarLayout appBarLayout, CollapsingToolbarLayout collapsingToolbarLayout, Toolbar toolbar, @ColorInt int statusColor) {} } static final BaseImpl IMPL; static { final int version = android.os.Build.VERSION.SDK_INT; if (version >= Build.VERSION_CODES.LOLLIPOP) { IMPL = new StatusBarCompatLollipop(); } else if (version >= Build.VERSION_CODES.KITKAT) { IMPL = new StatusBarCompatKitKat(); } else { IMPL = new BaseImpl(); } } /** * set statusBarColor * * @param statusColor color * @param alpha 0 - 255 */ public static void setStatusBarColor(@NonNull Activity activity, @ColorInt int statusColor, int alpha) { setStatusBarColor(activity, calculateStatusBarColor(statusColor, alpha)); } public static void setStatusBarColor(@NonNull Activity activity, @ColorInt int statusColor) { IMPL.setStatusBarColor(activity, statusColor); } public static void translucentStatusBar(@NonNull Activity activity) { translucentStatusBar(activity, false); } /** * change to full screen mode * * @param hideStatusBarBackground hide status bar alpha Background when SDK > 21, true if hide it */ public static void translucentStatusBar(@NonNull Activity activity, boolean hideStatusBarBackground) { IMPL.translucentStatusBar(activity, hideStatusBarBackground); } public static void setStatusBarColorForCollapsingToolbar(@NonNull Activity activity, AppBarLayout appBarLayout, CollapsingToolbarLayout collapsingToolbarLayout, Toolbar toolbar, @ColorInt int statusColor) { IMPL.setStatusBarColorForCollapsingToolbar(activity, appBarLayout, collapsingToolbarLayout, toolbar, statusColor); } //Get alpha color static int calculateStatusBarColor(int color, int alpha) { 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; } /** * return statusBar's Height in pixels */ public static int getStatusBarHeight(Context context) { //Api level 19以下,系统没有开放status bar的开放权限,返回0 if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return 0; } int result = 0; int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) { result = context.getResources().getDimensionPixelOffset(resId); } return result; } }
ontext); init(); } public FitStatusBarHeightView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public FitStatusBarHeightView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { Activity activity = UIUtils.getActivityFromContext(getContext()); if (activity != null) { StatusBarCompat.translucentStatusBar(activity, true); } } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(StatusBarCompat.getStatusBarHeight(getContext()), MeasureSpec.EXACTLY)); }