195 lines
7.3 KiB
Java
195 lines
7.3 KiB
Java
package com.gh.common.util;
|
||
|
||
import android.app.Activity;
|
||
import android.content.Context;
|
||
import android.content.res.Resources;
|
||
import android.graphics.Color;
|
||
import android.os.Build;
|
||
import android.view.View;
|
||
import android.view.Window;
|
||
import android.view.WindowManager;
|
||
|
||
import com.halo.assistant.HaloApp;
|
||
|
||
import java.lang.reflect.Field;
|
||
import java.lang.reflect.Method;
|
||
|
||
import androidx.core.content.ContextCompat;
|
||
|
||
public class DisplayUtils {
|
||
|
||
/**
|
||
* 根据手机的分辨率从 dip(像素) 的单位 转成为 px
|
||
*/
|
||
public static int dip2px(Context context, float dpValue) {
|
||
final float scale = context.getResources().getDisplayMetrics().density;
|
||
return (int) (dpValue * scale + 0.5f);
|
||
}
|
||
|
||
/**
|
||
* 根据手机的分辨率从 px(像素) 的单位 转成为 dip
|
||
*/
|
||
public static int px2dip(Context context, float pxValue) {
|
||
final float scale = context.getResources().getDisplayMetrics().density;
|
||
return (int) (pxValue / scale + 0.5f);
|
||
}
|
||
|
||
/**
|
||
* 根据手机的分辨率从 dip(像素) 的单位 转成为 px
|
||
*/
|
||
public static int dip2px(float dpValue) {
|
||
final float scale = HaloApp.getInstance()
|
||
.getApplication()
|
||
.getResources()
|
||
.getDisplayMetrics().density;
|
||
return (int) (dpValue * scale + 0.5f);
|
||
}
|
||
|
||
|
||
/**
|
||
* 将px值转换为sp值,保证文字大小不变
|
||
*
|
||
* @param pxValue
|
||
* @param pxValue (DisplayMetrics类中属性scaledDensity)
|
||
* @return
|
||
*/
|
||
public static int px2sp(Context context, float pxValue) {
|
||
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
|
||
return (int) (pxValue / fontScale + 0.5f);
|
||
}
|
||
|
||
/**
|
||
* 将sp值转换为px值,保证文字大小不变
|
||
*
|
||
* @param spValue
|
||
* @param spValue (DisplayMetrics类中属性scaledDensity)
|
||
* @return
|
||
*/
|
||
public static int sp2px(Context context, float spValue) {
|
||
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
|
||
return (int) (spValue * fontScale + 0.5f);
|
||
}
|
||
|
||
/**
|
||
* 获取状态栏的高度
|
||
*
|
||
* @param resources 资源
|
||
* @return height
|
||
*/
|
||
public static int getStatusBarHeight(Resources resources) {
|
||
return getInternalDimensionSize(resources, "status_bar_height");
|
||
}
|
||
|
||
public static 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;
|
||
}
|
||
|
||
public static void transparentStatusBar(Activity activity) {
|
||
//make full transparent statusBar
|
||
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
|
||
setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true);
|
||
}
|
||
if (Build.VERSION.SDK_INT >= 19) {
|
||
activity.getWindow()
|
||
.getDecorView()
|
||
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
|
||
}
|
||
if (Build.VERSION.SDK_INT >= 21) {
|
||
setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
|
||
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
|
||
}
|
||
}
|
||
|
||
public static void transparentStatusAndNavigation(Activity activity) {
|
||
//make full transparent statusBar
|
||
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
|
||
setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, true);
|
||
}
|
||
if (Build.VERSION.SDK_INT >= 19) {
|
||
activity.getWindow()
|
||
.getDecorView()
|
||
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
|
||
}
|
||
if (Build.VERSION.SDK_INT >= 21) {
|
||
setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, false);
|
||
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
|
||
activity.getWindow().setNavigationBarColor(Color.TRANSPARENT);
|
||
}
|
||
}
|
||
|
||
private static void setWindowFlag(Activity activity, final int bits, boolean on) {
|
||
Window win = activity.getWindow();
|
||
WindowManager.LayoutParams winParams = win.getAttributes();
|
||
if (on) {
|
||
winParams.flags |= bits;
|
||
} else {
|
||
winParams.flags &= ~bits;
|
||
}
|
||
win.setAttributes(winParams);
|
||
}
|
||
|
||
public static void setLightStatusBar(Activity activity, boolean lightStatusBar) {
|
||
boolean isMIUI = setMIUIStatusBarStyle(activity, lightStatusBar);
|
||
|
||
if (!isMIUI) {
|
||
Window window = activity.getWindow();
|
||
View decor = window.getDecorView();
|
||
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||
if (lightStatusBar) {
|
||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
||
} else {
|
||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
|
||
}
|
||
} else {
|
||
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
|
||
}
|
||
}
|
||
}
|
||
|
||
private static boolean setMIUIStatusBarStyle(Activity activity, boolean lightStatusBar) {
|
||
boolean result = false;
|
||
Window window = activity.getWindow();
|
||
if (window != null) {
|
||
Class clazz = window.getClass();
|
||
try {
|
||
int darkModeFlag = 0;
|
||
Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
|
||
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
|
||
darkModeFlag = field.getInt(layoutParams);
|
||
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
|
||
extraFlagField.invoke(window, lightStatusBar ? darkModeFlag : 0, darkModeFlag);//状态栏透明且黑色字体
|
||
result = true;
|
||
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && lightStatusBar) {
|
||
//开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上
|
||
activity.getWindow()
|
||
.getDecorView()
|
||
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
||
}
|
||
} catch (Exception e) {
|
||
// do nothing
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static void setStatusBarColor(Activity activity, int color, boolean lightStatusBar) {
|
||
Window window = activity.getWindow();
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||
window.setStatusBarColor(ContextCompat.getColor(activity,color));
|
||
}
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||
|
||
setLightStatusBar(activity,lightStatusBar);
|
||
|
||
}
|
||
}
|
||
|
||
}
|