From 7de77012e4bf897d736dfdf4339548951ffaa408 Mon Sep 17 00:00:00 2001 From: DXL <64101226@qq.com> Date: Thu, 27 Aug 2020 12:34:59 +0800 Subject: [PATCH] Create StatusBarUtil.java --- appmain/utils/status/StatusBarUtil.java | 214 ++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 appmain/utils/status/StatusBarUtil.java diff --git a/appmain/utils/status/StatusBarUtil.java b/appmain/utils/status/StatusBarUtil.java new file mode 100644 index 0000000..eafbedf --- /dev/null +++ b/appmain/utils/status/StatusBarUtil.java @@ -0,0 +1,214 @@ +package com.proxgrind.chameleon.utils.status; + +import android.annotation.SuppressLint; +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.IntDef; + +import com.proxgrind.chameleon.utils.system.RomUtils; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class StatusBarUtil { + public final static int TYPE_MIUI = 0; + public final static int TYPE_FLYME = 1; + public final static int TYPE_M = 3;//6.0 + + @IntDef({TYPE_MIUI, + TYPE_FLYME, + TYPE_M}) + @Retention(RetentionPolicy.SOURCE) + @interface ViewType { + } + + /** + * 修改状态栏颜色,支持4.4以上版本 + * + * @param colorId 颜色 + */ + public static void setStatusBarColor(Activity activity, int colorId) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = activity.getWindow(); + window.setStatusBarColor(colorId); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + //使用SystemBarTintManager,需要先将状态栏设置为透明 + setTranslucentStatus(activity); + SystemBarTintManager systemBarTintManager = new SystemBarTintManager(activity); + systemBarTintManager.setStatusBarTintEnabled(true);//显示状态栏 + systemBarTintManager.setStatusBarTintColor(colorId);//设置状态栏颜色 + } + } + + /** + * 设置状态栏透明 + */ + @TargetApi(19) + public static void setTranslucentStatus(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + //5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色 + Window window = activity.getWindow(); + View decorView = window.getDecorView(); + //两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间 + int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; + decorView.setSystemUiVisibility(option); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + //导航栏颜色也可以正常设置 + //window.setNavigationBarColor(Color.TRANSPARENT); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + Window window = activity.getWindow(); + WindowManager.LayoutParams attributes = window.getAttributes(); + int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; + attributes.flags |= flagTranslucentStatus; + //int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; + //attributes.flags |= flagTranslucentNavigation; + window.setAttributes(attributes); + } + } + + + /** + * 代码实现android:fitsSystemWindows + * + * @param activity + */ + public static void setRootViewFitsSystemWindows(Activity activity, boolean fitSystemWindows) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + ViewGroup winContent = (ViewGroup) activity.findViewById(android.R.id.content); + if (winContent.getChildCount() > 0) { + ViewGroup rootView = (ViewGroup) winContent.getChildAt(0); + if (rootView != null) { + rootView.setFitsSystemWindows(fitSystemWindows); + } + } + } + + } + + + /** + * 设置状态栏深色浅色切换 + */ + public static boolean setStatusBarDarkTheme(Activity activity, boolean dark) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + setStatusBarFontIconDark(activity, TYPE_M, dark); + } else if (RomUtils.isMiui()) { + setStatusBarFontIconDark(activity, TYPE_MIUI, dark); + } else if (RomUtils.isFlyme()) { + setStatusBarFontIconDark(activity, TYPE_FLYME, dark); + } else {//其他情况 + return false; + } + return true; + } + return false; + } + + /** + * 设置 状态栏深色浅色切换 + */ + public static boolean setStatusBarFontIconDark(Activity activity, @ViewType int type, boolean dark) { + switch (type) { + case TYPE_MIUI: + return setMiuiUI(activity, dark); + case TYPE_FLYME: + return setFlymeUI(activity, dark); + case TYPE_M: + default: + return setCommonUI(activity, dark); + } + } + + //设置6.0 状态栏深色浅色切换 + public static boolean setCommonUI(Activity activity, boolean dark) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + View decorView = activity.getWindow().getDecorView(); + if (decorView != null) { + int vis = decorView.getSystemUiVisibility(); + if (dark) { + vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } else { + vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } + if (decorView.getSystemUiVisibility() != vis) { + decorView.setSystemUiVisibility(vis); + } + return true; + } + } + return false; + + } + + //设置Flyme 状态栏深色浅色切换 + public static boolean setFlymeUI(Activity activity, boolean dark) { + try { + Window window = activity.getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); + Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags"); + darkFlag.setAccessible(true); + meizuFlags.setAccessible(true); + int bit = darkFlag.getInt(null); + int value = meizuFlags.getInt(lp); + if (dark) { + value |= bit; + } else { + value &= ~bit; + } + meizuFlags.setInt(lp, value); + window.setAttributes(lp); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + //设置MIUI 状态栏深色浅色切换 + public static boolean setMiuiUI(Activity activity, boolean dark) { + try { + Window window = activity.getWindow(); + Class clazz = activity.getWindow().getClass(); + @SuppressLint("PrivateApi") Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); + Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); + int darkModeFlag = field.getInt(layoutParams); + Method extraFlagField = clazz.getDeclaredMethod("setExtraFlags", int.class, int.class); + extraFlagField.setAccessible(true); + if (dark) { //状态栏亮色且黑色字体 + extraFlagField.invoke(window, darkModeFlag, darkModeFlag); + } else { + extraFlagField.invoke(window, 0, darkModeFlag); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + //获取状态栏高度 + public static int getStatusBarHeight(Context context) { + int result = 0; + int resourceId = context.getResources().getIdentifier( + "status_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = context.getResources().getDimensionPixelSize(resourceId); + } + return result; + } +}