public class DisplayHelper {
public static final float DENSITY = Resources.getSystem()
.getDisplayMetrics().density;
public static DisplayMetrics getDisplayMetrics(Context context) {
return context.getResources().getDisplayMetrics();
}
public static int dpToPx(int dpValue) {
return (int) (dpValue * DENSITY + 0.5f);
}
public static int pxToDp(float pxValue) {
return (int) (pxValue / DENSITY + 0.5f);
}
public static int sp2px(Context context, int sp) {
return (int) (getFontDensity(context) * sp + 0.5);
}
public static int px2sp(Context context, int px) {
return (int) (px / getFontDensity(context) + 0.5);
}
public static float getDensity(Context context) {
return context.getResources().getDisplayMetrics().density;
}
public static float getFontDensity(Context context) {
return context.getResources().getDisplayMetrics().scaledDensity;
}
public static int getScreenWidth(Context context) {
return getDisplayMetrics(context).widthPixels;
}
public static int getScreenHeight(Context context) {
int screenHeight = getDisplayMetrics(context).heightPixels;
if(QMUIDeviceHelper.isXiaomi() && xiaomiNavigationGestureEnabled(context)){
screenHeight += getResourceNavHeight(context);
}
return screenHeight;
}
public static int getStatusBarHeight(Context context) {
try {
Class> c = Class.forName("com.android.internal.R$dimen");
Object obj = c.newInstance();
Field field = c.getField("status_bar_height");
int x = Integer.parseInt(field.get(obj).toString());
if(x > 0){
return context.getResources().getDimensionPixelSize(x);
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
private static int getResourceNavHeight(Context context){
int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return context.getResources().getDimensionPixelSize(resourceId);
}
return -1;
}
public static boolean deviceHasNavigationBar() {
boolean haveNav = false;
try {
//1.通过WindowManagerGlobal获取windowManagerService
// 反射方法:IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService();
Class> windowManagerGlobalClass = Class.forName("android.view.WindowManagerGlobal");
Method getWmServiceMethod = windowManagerGlobalClass.getDeclaredMethod("getWindowManagerService");
getWmServiceMethod.setAccessible(true);
//getWindowManagerService是静态方法,所以invoke null
Object iWindowManager = getWmServiceMethod.invoke(null);
//2.获取windowMangerService的hasNavigationBar方法返回值
// 反射方法:haveNav = windowManagerService.hasNavigationBar();
Class> iWindowManagerClass = iWindowManager.getClass();
Method hasNavBarMethod = iWindowManagerClass.getDeclaredMethod("hasNavigationBar");
hasNavBarMethod.setAccessible(true);
haveNav = (Boolean) hasNavBarMethod.invoke(iWindowManager);
} catch (Exception e) {
e.printStackTrace();
}
return haveNav;
}
}