package com.zhaoyang.driver.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<? extends Window> 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;
|
}
|
|
}
|