一、本次用的是java,工具类如下
package bai.bai.bai.demo.systembar;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build.VERSION;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import java.lang.reflect.Method;
public class SystemBarTintManager {
public static final int DEFAULT_TINT_COLOR = -1728053248;
private static String sNavBarOverride;
private SystemBarTintManager.SystemBarConfig mConfig;
private boolean mStatusBarAvailable;
private boolean mNavBarAvailable;
private boolean mStatusBarTintEnabled;
private boolean mNavBarTintEnabled;
private View mStatusBarTintView;//顶部状态栏
private View mNavBarTintView;//底部导航栏(如华为)
public SystemBarTintManager(Activity activity) {
Window win = activity.getWindow();
ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();
if (VERSION.SDK_INT >= 19) {
int[] attrs = new int[]{16843759, 16843760};
TypedArray a = activity.obtainStyledAttributes(attrs);
try {
this.mStatusBarAvailable = a.getBoolean(0, false);
this.mNavBarAvailable = a.getBoolean(1, false);
} finally {
a.recycle();
}
LayoutParams winParams = win.getAttributes();
int bits = 67108864;
if ((winParams.flags & bits) != 0) {
this.mStatusBarAvailable = true;
}
bits = 134217728;
if ((winParams.flags & bits) != 0) {
this.mNavBarAvailable = true;
}
}
this.mConfig = new SystemBarTintManager.SystemBarConfig(activity, this.mStatusBarAvailable, this.mNavBarAvailable);
if (!this.mConfig.hasNavigtionBar()) {
this.mNavBarAvailable = false;
}
if (this.mStatusBarAvailable) {
this.setupStatusBarView(activity, decorViewGroup);
}
if (this.mNavBarAvailable) {
this.setupNavBarView(activity, decorViewGroup);
}
}
public void setStatusBarTintEnabled(boolean enabled) {
this.mStatusBarTintEnabled = enabled;
if (this.mStatusBarAvailable) {
this.mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);//baibai
}
}
public void setNavigationBarTintEnabled(boolean enabled) {
this.mNavBarTintEnabled = enabled;
if (this.mNavBarAvailable) {
this.mNavBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);//baibai
}
}
/**
* 设置标题栏为某个颜色
*/
public void setTintColor(int color) {
this.setStatusBarTintColor(color);
this.setNavigationBarTintColor(color);
}
/**
* 设置标题栏为某张图片
*/
public void setTintResource(int res) {
this.setStatusBarTintResource(res);
this.setNavigationBarTintResource(res);
}
/**
* 设置标题栏为某张图片
*/
public void setTintDrawable(Drawable drawable) {
this.setStatusBarTintDrawable(drawable);
this.setNavigationBarTintDrawable(drawable);
}
/**
* 设置标题栏透明度
*/
public void setTintAlpha(float alpha) {
this.setStatusBarAlpha(alpha);
this.setNavigationBarAlpha(alpha);
}
private void setStatusBarTintColor(int color) {
if (this.mStatusBarAvailable) {
this.mStatusBarTintView.setBackgroundColor(color);
}
}
private void setStatusBarTintResource(int res) {
if (this.mStatusBarAvailable) {
this.mStatusBarTintView.setBackgroundResource(res);
}
}
private void setStatusBarTintDrawable(Drawable drawable) {
if (this.mStatusBarAvailable) {
this.mStatusBarTintView.setBackgroundDrawable(drawable);
}
}
private void setStatusBarAlpha(float alpha) {
if (this.mStatusBarAvailable) {
this.mStatusBarTintView.setAlpha(alpha);
}
}
private void setNavigationBarTintColor(int color) {
if (this.mNavBarAvailable) {
this.mNavBarTintView.setBackgroundColor(color);
}
}
private void setNavigationBarTintResource(int res) {
if (this.mNavBarAvailable) {
this.mNavBarTintView.setBackgroundResource(res);
}
}
private void setNavigationBarTintDrawable(Drawable drawable) {
if (this.mNavBarAvailable) {
this.mNavBarTintView.setBackgroundDrawable(drawable);
}
}
private void setNavigationBarAlpha(float alpha) {
if (this.mNavBarAvailable) {
this.mNavBarTintView.setAlpha(alpha);
}
}
public SystemBarTintManager.SystemBarConfig getConfig() {
return this.mConfig;
}
public boolean isStatusBarTintEnabled() {
return this.mStatusBarTintEnabled;
}
public boolean isNavigationBarTintEnabled() {
return this.mNavBarTintEnabled;
}
private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {
this.mStatusBarTintView = new View(context);
android.widget.FrameLayout.LayoutParams params = new android.widget.FrameLayout.LayoutParams(-1, this.mConfig.getStatusBarHeight());
params.gravity = 48;
if (this.mNavBarAvailable && !this.mConfig.isNavigationAtBottom()) {
params.rightMargin = this.mConfig.getNavigationBarWidth();
}
this.mStatusBarTintView.setLayoutParams(params);
this.mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
this.mStatusBarTintView.setVisibility(View.GONE);//baibai
decorViewGroup.addView(this.mStatusBarTintView);
}
private void setupNavBarView(Context context, ViewGroup decorViewGroup) {
this.mNavBarTintView = new View(context);
android.widget.FrameLayout.LayoutParams params;
if (this.mConfig.isNavigationAtBottom()) {
params = new android.widget.FrameLayout.LayoutParams(-1, this.mConfig.getNavigationBarHeight());
params.gravity = 80;
} else {
params = new android.widget.FrameLayout.LayoutParams(this.mConfig.getNavigationBarWidth(), -1);
params.gravity = 5;
}
this.mNavBarTintView.setLayoutParams(params);
this.mNavBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
this.mNavBarTintView.setVisibility(View.GONE);//baibai
decorViewGroup.addView(this.mNavBarTintView);
}
public static class SystemBarConfig {
private final boolean mTranslucentStatusBar;
private final boolean mTranslucentNavBar;
private final int mStatusBarHeight;
private final int mActionBarHeight;
private final boolean mHasNavigationBar;
private final int mNavigationBarHeight;
private final int mNavigationBarWidth;
private final boolean mInPortrait;
private final float mSmallestWidthDp;
private SystemBarConfig(Activity activity, boolean translucentStatusBar, boolean traslucentNavBar) {
Resources res = activity.getResources();
this.mInPortrait = res.getConfiguration().orientation == 1;
this.mSmallestWidthDp = this.getSmallestWidthDp(activity);
this.mStatusBarHeight = this.getInternalDimensionSize(res, "status_bar_height");
this.mActionBarHeight = this.getActionBarHeight(activity);
this.mNavigationBarHeight = this.getNavigationBarHeight(activity);
this.mNavigationBarWidth = this.getNavigationBarWidth(activity);
this.mHasNavigationBar = this.mNavigationBarHeight > 0;
this.mTranslucentStatusBar = translucentStatusBar;
this.mTranslucentNavBar = traslucentNavBar;
Log.d("baibai", "actionBarHeight = " + getActionBarHeight() + ", NavigationHeight = " + getNavigationBarHeight());
}
private int getActionBarHeight(Context context) {
int result = 0;
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(16843499, tv, true);
result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());
return result;
}
private int getNavigationBarHeight(Context context) {
Resources res = context.getResources();
int result = 0;
if (this.hasNavBar(context)) {
String key;
if (this.mInPortrait) {
key = "navigation_bar_height";
} else {
key = "navigation_bar_height_landscape";
}
return this.getInternalDimensionSize(res, key);
} else {
return result;
}
}
private int getNavigationBarWidth(Context context) {
Resources res = context.getResources();
int result = 0;
return this.hasNavBar(context) ? this.getInternalDimensionSize(res, "navigation_bar_width") : result;
}
private boolean hasNavBar(Context context) {
Resources res = context.getResources();
int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");
if (resourceId != 0) {
boolean hasNav = res.getBoolean(resourceId);
if ("1".equals(SystemBarTintManager.sNavBarOverride)) {
hasNav = false;
} else if ("0".equals(SystemBarTintManager.sNavBarOverride)) {
hasNav = true;
}
return hasNav;
} else {
return !ViewConfiguration.get(context).hasPermanentMenuKey();
}
}
private int getInternalDimensionSize(Resources res, String key) {
int result = 0;
int resourceId = res.getIdentifier(key, "dimen", "android");
if (resourceId > 0) {
result = res.getDimensionPixelSize(resourceId);
}
return result;
}
@SuppressLint({"NewApi"})
private float getSmallestWidthDp(Activity activity) {
DisplayMetrics metrics = new DisplayMetrics();
if (VERSION.SDK_INT >= 16) {
activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
} else {
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
}
float widthDp = (float) metrics.widthPixels / metrics.density;
float heightDp = (float) metrics.heightPixels / metrics.density;
return Math.min(widthDp, heightDp);
}
private boolean isNavigationAtBottom() {
return this.mSmallestWidthDp >= 600.0F || this.mInPortrait;
}
private int getStatusBarHeight() {
return this.mStatusBarHeight;
}
public int getActionBarHeight() {
return this.mActionBarHeight;
}
private boolean hasNavigtionBar() {
return this.mHasNavigationBar;
}
private int getNavigationBarHeight() {
return this.mNavigationBarHeight;
}
private int getNavigationBarWidth() {
return this.mNavigationBarWidth;
}
public int getPixelInsetTop(boolean withActionBar) {
return (this.mTranslucentStatusBar ? this.mStatusBarHeight : 0) + (withActionBar ? this.mActionBarHeight : 0);
}
public int getPixelInsetBottom() {
return this.mTranslucentNavBar && this.isNavigationAtBottom() ? this.mNavigationBarHeight : 0;
}
public int getPixelInsetRight() {
return this.mTranslucentNavBar && !this.isNavigationAtBottom() ? this.mNavigationBarWidth : 0;
}
}
}
二、引用(activity)
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
val win = window
val winParams = win.attributes
val bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
winParams.flags = winParams.flags or bits
win.attributes = winParams
// 创建状态栏的管理实例
val tintManager = SystemBarTintManager(this)
// 激活状态栏设置
tintManager.isStatusBarTintEnabled = true
tintManager.isNavigationBarTintEnabled = false
// 设置一个颜色给系统栏
tintManager.setTintColor(resources.getColor(R.color.colorAccent))
// tintManager.setTintAlpha(0.3f)
// tintManager.setTintDrawable(android.support.v4.content.ContextCompat.getDrawable(this,R.drawable.ic_launcher_background))
// tintManager.setTintResource(R.drawable.pay_icon_ali)
}
三、在xml里
界面布局根布局里添加属性:
android:fitsSystemWindows="true"
如果有多个activity,修改比较麻烦,可以直接在application的style里添加这个属性,就不用一个activity一个activity添加了
<item name="android:fitsSystemWindows">true</item>