自定義工具類-----沉浸式標題欄
阿新 • • 發佈:2019-01-11
一、本次用的是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>