1.第一种方法
Window window = ((Activity)context).getWindow();
if (Build.VERSION.SDK_INT >= 21) {
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= 19) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
2.第二种方法
UltimateBar.newColorBuilder()
.statusColor(Color.parseColor("#009687")) // 状态栏颜色
.applyNav(true)
.navColor(Color.parseColor("#009687")) // 导航栏颜色
.build((Activity) context)
.apply();
package cn.kaitong.com.module.acceptcheck.utils;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
/**
*沉浸式状态
*/
public class UltimateBar {
private static final int TYPE_COLOR = 1;
private static final int TYPE_TRANSPARENT = 2;
private static final int TYPE_IMMERSION = 3;
private static final int TYPE_DRAWER = 4;
private static final int TYPE_HIDE = 5;
private Activity activity;
private int type;
public UltimateBar(Activity activity) {
this.activity = activity;
}
private ColorBuilder colorBuilder;
private UltimateBar(Activity activity, ColorBuilder builder) {
this.activity = activity;
this.type = TYPE_COLOR;
this.colorBuilder = builder;
}
private TransparentBuilder transparentBuilder;
private UltimateBar(Activity activity, TransparentBuilder builder) {
this.activity = activity;
this.type = TYPE_TRANSPARENT;
this.transparentBuilder = builder;
}
private ImmersionBuilder immersionBuilder;
private UltimateBar(Activity activity, ImmersionBuilder builder) {
this.activity = activity;
this.type = TYPE_IMMERSION;
this.immersionBuilder = builder;
}
private DrawerBuilder drawerBuilder;
private UltimateBar(Activity activity, DrawerBuilder builder) {
this.activity = activity;
this.type = TYPE_DRAWER;
this.drawerBuilder = builder;
}
private HideBuilder hideBuilder;
private UltimateBar(Activity activity, HideBuilder builder) {
this.activity = activity;
this.type = TYPE_HIDE;
this.hideBuilder = builder;
}
public static ColorBuilder newColorBuilder() {
return new ColorBuilder();
}
public static TransparentBuilder newTransparentBuilder() {
return new TransparentBuilder();
}
public static ImmersionBuilder newImmersionBuilder() {
return new ImmersionBuilder();
}
public static DrawerBuilder newDrawerBuilder() {
return new DrawerBuilder();
}
public static HideBuilder newHideBuilder() {
return new HideBuilder();
}
public void apply() {
if (type == TYPE_COLOR) {
setColorBar(colorBuilder.statusColor, colorBuilder.statusDepth,
colorBuilder.applyNav, colorBuilder.navColor, colorBuilder.navDepth);
} else if (type == TYPE_TRANSPARENT) {
setTransparentBar(transparentBuilder.statusColor, transparentBuilder.statusAlpha,
transparentBuilder.applyNav, transparentBuilder.navColor, transparentBuilder.navAlpha);
} else if (type == TYPE_IMMERSION) {
setTransparentBar(Color.TRANSPARENT, 0, immersionBuilder.applyNav,
Color.TRANSPARENT, 0);
} else if (type == TYPE_DRAWER) {
setColorBarForDrawer(drawerBuilder.statusColor, drawerBuilder.statusDepth,
drawerBuilder.applyNav, drawerBuilder.navColor, drawerBuilder.navDepth);
} else if (type == TYPE_HIDE) {
setHideBar(hideBuilder.applyNav);
}
}
/**
* StatusBar and navigationBar color
* @param statusColor StatusBar color
* @param statusDepth StatusBar color depth
* @param navColor NavigationBar color
* @param navDepth NavigationBar color depth
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBar(@ColorInt int statusColor, int statusDepth,
@ColorInt int navColor, int navDepth) {
setColorBar(statusColor, statusDepth, true, navColor, navDepth);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBar(@ColorInt int statusColor, @ColorInt int navColor) {
setColorBar(statusColor, 0, navColor, 0);
}
/**
* StatusBar and NavigationBar hide
* @param applyNav apply NavigationBar
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
private void setHideBar(boolean applyNav) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
View decorView = activity.getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
if (applyNav) {
option = option | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}
decorView.setSystemUiVisibility(option);
}
}
/**
* StatusBar and NavigationBar color
* @param statusColor StatusBar color
* @param statusDepth StatusBar color depth
* @param applyNav apply NavigationBar or no
* @param navColor NavigationBar color (applyNav == true)
* @param navDepth NavigationBar color depth (applyNav = true)
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
private void setColorBar(@ColorInt int statusColor, int statusDepth, boolean applyNav,
@ColorInt int navColor, int navDepth) {
int realStatusDepth = limitDepthOrAlpha(statusDepth);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
int finalStatusColor = realStatusDepth == 0 ? statusColor : calculateColor(statusColor, realStatusDepth);
window.setStatusBarColor(finalStatusColor);
if (applyNav) {
int realNavDepth = limitDepthOrAlpha(navDepth);
int finalNavColor = realNavDepth == 0 ? navColor : calculateColor(navColor, realNavDepth);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.setNavigationBarColor(finalNavColor);
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
int finalStatusColor = realStatusDepth == 0 ? statusColor : calculateColor(statusColor, realStatusDepth);
ViewGroup decorView = (ViewGroup) window.getDecorView();
decorView.addView(createStatusBarView(activity, finalStatusColor));
if (applyNav && navigationBarExist(activity)) {
int realNavDepth = limitDepthOrAlpha(navDepth);
int finalNavColor = realNavDepth == 0 ? navColor : calculateColor(navColor, realNavDepth);
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
decorView.addView(createNavBarView(activity, finalNavColor));
}
setRootView(activity, true);
}
}
/**
* StatusBar and NavigationBar transparent
* @param statusColor StatusBar color
* @param statusAlpha StatusBar alpha
* @param applyNav apply NavigationBar or no
* @param navColor NavigationBar color (applyNav == true)
* @param navAlpha NavigationBar alpha (applyNav == true)
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
private void setTransparentBar(@ColorInt int statusColor, int statusAlpha, boolean applyNav,
@ColorInt int navColor, int navAlpha) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
View decorView = window.getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
int finalStatusColor = statusColor == 0 ? Color.TRANSPARENT :
Color.argb(limitDepthOrAlpha(statusAlpha), Color.red(statusColor),
Color.green(statusColor), Color.blue(statusColor));
window.setStatusBarColor(finalStatusColor);
if (applyNav) {
option = option | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
int finalNavColor = navColor == 0 ? Color.TRANSPARENT :
Color.argb(limitDepthOrAlpha(navAlpha), Color.red(navColor),
Color.green(navColor), Color.blue(navColor));
window.setNavigationBarColor(finalNavColor);
}
decorView.setSystemUiVisibility(option);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) window.getDecorView();
int finalStatusColor = statusColor == 0 ? Color.TRANSPARENT :
Color.argb(limitDepthOrAlpha(statusAlpha), Color.red(statusColor),
Color.green(statusColor), Color.blue(statusColor));
decorView.addView(createStatusBarView(activity, finalStatusColor));
if (applyNav && navigationBarExist(activity)) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
int finalNavColor = navColor == 0 ? Color.TRANSPARENT :
Color.argb(limitDepthOrAlpha(navAlpha), Color.red(navColor),
Color.green(navColor), Color.blue(navColor));
decorView.addView(createNavBarView(activity, finalNavColor));
}
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private void setColorBarForDrawer(@ColorInt int statusColor, int statusDepth, boolean applyNav,
@ColorInt int navColor, int navDepth) {
int realStatusDepth = limitDepthOrAlpha(statusDepth);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
ViewGroup decorView = (ViewGroup) window.getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
window.setStatusBarColor(Color.TRANSPARENT);
int finalStatusColor = realStatusDepth == 0 ? statusColor : calculateColor(statusColor, realStatusDepth);
decorView.addView(createStatusBarView(activity, finalStatusColor), 0);
if (applyNav && navigationBarExist(activity)) {
window.setNavigationBarColor(Color.TRANSPARENT);
int realNavDepth = limitDepthOrAlpha(navDepth);
int finalNavColor = realNavDepth == 0 ? navColor : calculateColor(navColor, realNavDepth);
decorView.addView(createNavBarView(activity, finalNavColor), 1);
option = option | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
}
decorView.setSystemUiVisibility(option);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) window.getDecorView();
int finalStatusColor = realStatusDepth == 0 ? statusColor : calculateColor(statusColor, realStatusDepth);
decorView.addView(createStatusBarView(activity, finalStatusColor), 0);
if (applyNav && navigationBarExist(activity)) {
int realNavDepth = limitDepthOrAlpha(navDepth);
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
int finalNavColor = realNavDepth == 0 ? navColor : calculateColor(navColor, realNavDepth);
decorView.addView(createNavBarView(activity, finalNavColor), 1);
}
}
}
private int limitDepthOrAlpha(int depthOrAlpha) {
if (depthOrAlpha < 0) {
return 0;
}
if (depthOrAlpha > 255) {
return 255;
}
return depthOrAlpha;
}
private View createStatusBarView(Context context, @ColorInt int color) {
View statusBarView = new View(context);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams
(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));
params.gravity = Gravity.TOP;
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(color);
return statusBarView;
}
private View createNavBarView(Context context, @ColorInt int color) {
View navBarView = new View(context);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams
(FrameLayout.LayoutParams.MATCH_PARENT, getNavigationHeight(context));
params.gravity = Gravity.BOTTOM;
navBarView.setLayoutParams(params);
navBarView.setBackgroundColor(color);
return navBarView;
}
private boolean navigationBarExist(Activity activity) {
WindowManager windowManager = activity.getWindowManager();
Display d = windowManager.getDefaultDisplay();
DisplayMetrics realDisplayMetrics = new DisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
d.getRealMetrics(realDisplayMetrics);
}
int realHeight = realDisplayMetrics.heightPixels;
int realWidth = realDisplayMetrics.widthPixels;
DisplayMetrics displayMetrics = new DisplayMetrics();
d.getMetrics(displayMetrics);
int displayHeight = displayMetrics.heightPixels;
int displayWidth = displayMetrics.widthPixels;
return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
}
@ColorInt
private int calculateColor(@ColorInt 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;
}
private void setRootView(Activity activity, boolean fit) {
ViewGroup parent = (ViewGroup)activity.findViewById(android.R.id.content);
for (int i = 0; i < parent.getChildCount(); i++) {
View childView = parent.getChildAt(i);
if (childView instanceof ViewGroup) {
childView.setFitsSystemWindows(fit);
((ViewGroup)childView).setClipToPadding(fit);
}
}
}
private int getStatusBarHeight(Context context) {
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
return resources.getDimensionPixelSize(resourceId);
}
private int getNavigationHeight(Context context) {
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
return resources.getDimensionPixelSize(resourceId);
}
public static class ColorBuilder {
@ColorInt
private int statusColor;
private int statusDepth;
private boolean applyNav;
@ColorInt
private int navColor;
private int navDepth;
public ColorBuilder statusColor(@ColorInt int statusColor) {
this.statusColor = statusColor;
return this;
}
public ColorBuilder statusDepth(int statusDepth) {
this.statusDepth = statusDepth;
return this;
}
public ColorBuilder applyNav(boolean applyNav) {
this.applyNav = applyNav;
return this;
}
public ColorBuilder navColor(@ColorInt int navColor) {
this.navColor = navColor;
return this;
}
public ColorBuilder navDepth(int navDepth) {
this.navDepth = navDepth;
return this;
}
public UltimateBar build(Activity activity) {
return new UltimateBar(activity, this);
}
}
public static class TransparentBuilder {
@ColorInt
private int statusColor;
private int statusAlpha;
private boolean applyNav;
@ColorInt
private int navColor;
private int navAlpha;
public TransparentBuilder statusColor(@ColorInt int statusColor) {
this.statusColor = statusColor;
return this;
}
public TransparentBuilder statusAlpha(int statusAlpha) {
this.statusAlpha = statusAlpha;
return this;
}
public TransparentBuilder applyNav(boolean applyNav) {
this.applyNav = applyNav;
return this;
}
public TransparentBuilder navColor(@ColorInt int navColor) {
this.navColor = navColor;
return this;
}
public TransparentBuilder navAlpha(int navAlpha) {
this.navAlpha = navAlpha;
return this;
}
public UltimateBar build(Activity activity) {
return new UltimateBar(activity, this);
}
}
public static class ImmersionBuilder {
private boolean applyNav;
public ImmersionBuilder applyNav(boolean applyNav) {
this.applyNav = applyNav;
return this;
}
public UltimateBar build(Activity activity) {
return new UltimateBar(activity, this);
}
}
public static class DrawerBuilder {
@ColorInt
private int statusColor;
private int statusDepth;
private boolean applyNav;
@ColorInt
private int navColor;
private int navDepth;
public DrawerBuilder statusColor(@ColorInt int statusColor) {
this.statusColor = statusColor;
return this;
}
public DrawerBuilder statusDepth(int statusDepth) {
this.statusDepth = statusDepth;
return this;
}
public DrawerBuilder applyNav(boolean applyNav) {
this.applyNav = applyNav;
return this;
}
public DrawerBuilder navColor(@ColorInt int navColor) {
this.navColor = navColor;
return this;
}
public DrawerBuilder navDepth(int navDepth) {
this.navDepth = navDepth;
return this;
}
public UltimateBar build(Activity activity) {
return new UltimateBar(activity, this);
}
}
public static class HideBuilder {
private boolean applyNav;
public HideBuilder applyNav(boolean applyNav) {
this.applyNav = applyNav;
return this;
}
public UltimateBar build(Activity activity) {
return new UltimateBar(activity, this);
}
}
}