package com.future.dispatch.utils; 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.ColorInt; import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import java.lang.reflect.Field; import java.lang.reflect.Method; public class StatesBarUtil { /** * 通过设置全屏,设置状态栏透明 * * @param activity */ @Deprecated public static void fullScreen(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 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.setStatusBarColor(Color.parseColor("#5a000000")); } else { Window window = activity.getWindow(); WindowManager.LayoutParams attributes = window.getAttributes(); int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; attributes.flags |= flagTranslucentNavigation; window.setAttributes(attributes); } } } /** * @param activity * @param isLight 是否为高亮模式(黑色字体) */ private static void fullScreen(Activity activity, boolean isLight) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 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; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isLight) { option |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; } decorView.setSystemUiVisibility(option); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && isLight) { window.setStatusBarColor(Color.BLACK); } } else { Window window = activity.getWindow(); WindowManager.LayoutParams attributes = window.getAttributes(); int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; attributes.flags |= flagTranslucentNavigation; window.setAttributes(attributes); } } } /** * 通过设置全屏,设置状态栏透明,设置高亮模式(状态栏黑色字体) * * @param activity */ public static void fullScreenLightMode(Activity activity) { fullScreen(activity, true); String manufacturer = Build.MANUFACTURER; if (manufacturer.equals("Meizu")) { setMeizuStatusBarDarkIcon(activity, true); } else if (manufacturer.equals("Xiaomi")) { setMIUIStatusBarDarkIcon(activity, true); } } /** * 通过设置全屏,设置状态栏透明,设置深色模式(状态栏白色字体) * * @param activity */ public static void fullScreenDarkMode(Activity activity) { fullScreen(activity, false); String manufacturer = Build.MANUFACTURER; if (manufacturer.equals("Meizu")) { setMeizuStatusBarDarkIcon(activity, false); } else if (manufacturer.equals("Xiaomi")) { setMIUIStatusBarDarkIcon(activity, false); } } public static void lightForPadding(Fragment fragment, View view){ lightForPadding(fragment.getActivity(),view); } public static void lightForPadding(Activity activity,View view){ fullScreenLightMode(activity); forStatesBarPaddingTopOnView(activity,view); } public static void darkForPadding(Activity activity,View view){ fullScreenDarkMode(activity); forStatesBarPaddingTopOnView(activity,view); } /** * 为了显示states占位控件,设置一个paddingTop * * @param activity * @param view */ public static void forStatesBarPaddingTopOnView(Activity activity, View view) { ViewGroup contentFrameLayout = activity.findViewById(Window.ID_ANDROID_CONTENT); ViewGroup parentView = (ViewGroup) contentFrameLayout.getChildAt(0); if (parentView != null && Build.VERSION.SDK_INT >= 14) { if (view.getLayoutParams().height != ViewGroup.LayoutParams.MATCH_PARENT && view.getLayoutParams().height != ViewGroup.LayoutParams.WRAP_CONTENT) { view.getLayoutParams().height = view.getLayoutParams().height + getStatusBarHeight(activity); } view.setPadding(view.getPaddingLeft(), getStatusBarHeight(activity) + view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()); } } /** * 为了显示states占位控件,设置一个paddingTop * * @param fragment * @param view */ public static void forStatesBarPaddingTopOnView(Fragment fragment, View view) { forStatesBarPaddingTopOnView(fragment.getActivity(), view); } /** * 利用反射获取状态栏高度 * * @return */ public static int getStatusBarHeight(Context context) { int result = 0; //获取状态栏高度的资源id int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } return result; } /** * 修改 MIUI V6 以上状态栏颜色 */ private static void setMIUIStatusBarDarkIcon(@NonNull Activity activity, boolean darkIcon) { Class clazz = activity.getWindow().getClass(); try { 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.getMethod("setExtraFlags", int.class, int.class); extraFlagField.invoke(activity.getWindow(), darkIcon ? darkModeFlag : 0, darkModeFlag); } catch (Exception e) { //e.printStackTrace(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().setStatusBarColor(Color.BLACK); } } } /** * 修改魅族状态栏字体颜色 Flyme 4.0 */ private static void setMeizuStatusBarDarkIcon(@NonNull Activity activity, boolean darkIcon) { try { WindowManager.LayoutParams lp = activity.getWindow().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 (darkIcon) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); activity.getWindow().setAttributes(lp); } catch (Exception e) { //e.printStackTrace(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().setStatusBarColor(Color.BLACK); } } } /** * 设置状态栏颜色 * * @param activity 需要设置的activity * @param color 状态栏颜色值 * @param statusBarAlpha 状态栏透明度 */ public static void setColor(Activity activity, @ColorInt int color, @IntRange(from = 0, to = 255) int statusBarAlpha) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha)); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { } } /** * 设置状态栏颜色 * * @param activity 需要设置的activity * @param color 状态栏颜色值 */ public static void setColor(Activity activity, @ColorInt int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); activity.getWindow().setStatusBarColor(calculateStatusColor(color, 0)); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { } } /** * 计算状态栏颜色 * * @param color color值 * @param alpha alpha值 * @return 最终的状态栏颜色 */ private static int calculateStatusColor(@ColorInt int color, int alpha) { if (alpha == 0) { return color; } 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; } }