package com.chejdj.wanandroid.util; import android.app.Activity; import android.app.Application; import android.content.ComponentCallbacks; import android.content.Context; import android.content.res.Configuration; import android.support.annotation.NonNull; import android.util.DisplayMetrics; import android.view.Display; import android.view.Window; import android.view.WindowManager; import java.lang.reflect.Method; /** * Created by 皓然 on 2017/6/18. */ public class DisplayUtils { //获取屏幕原始尺寸高度,包括虚拟功能键高度 public static int getDpi(Context context){ int dpi = 0; WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); @SuppressWarnings("rawtypes") Class c; try { c = Class.forName("android.view.Display"); @SuppressWarnings("unchecked") Method method = c.getMethod("getRealMetrics",DisplayMetrics.class); method.invoke(display, displayMetrics); dpi=displayMetrics.heightPixels; }catch(Exception e){ e.printStackTrace(); } return dpi; } /** * 获取 虚拟按键的高度 * @param context * @return */ public static int getBottomStatusHeight(Context context){ int totalHeight = getDpi(context); int contentHeight = getScreenHeight(context); return totalHeight - contentHeight; } /** * 标题栏高度 * @return */ public static int getTitleHeight(Activity activity){ return activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); } /** * 获得状态栏的高度 * * @param context * @return */ public static int getStatusHeight(Context context) { int statusHeight = -1; try { Class<?> clazz = Class.forName("com.android.internal.R$dimen"); Object object = clazz.newInstance(); int height = Integer.parseInt(clazz.getField("status_bar_height") .get(object).toString()); statusHeight = context.getResources().getDimensionPixelSize(height); } catch (Exception e) { e.printStackTrace(); } return statusHeight; } /** * 获得屏幕高度 * * @param context * @return */ public static int getScreenHeight(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.heightPixels; } public static int getScreenWidth(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.widthPixels; } /** * 将px值转换为dip或dp值,保证尺寸大小不变 * @param context * @param pxValue * @return */ public static int px2dip(Context context, float pxValue) { float density = context.getResources().getDisplayMetrics().density; return (int) (pxValue / density + 0.5f); } /** * 将dip或dp值转换为px值,保证尺寸大小不变 * @param context * @param dipValue * @return */ public static int dip2px(Context context, float dipValue) { float density = context.getResources().getDisplayMetrics().density; return (int) (dipValue * density + 0.5f); } /** * 将px值转换为sp值,保证文字大小不变 * @param context * @param pxValue * @return */ public static int px2sp(Context context, float pxValue) { float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } /** * 将sp值转换为px值,保证文字大小不变 * @param context * @param spValue * @return */ public static int sp2px(Context context, float spValue) { float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } /** * 头条适配方案 修改设备密度 * 支持以宽或者高一个维度去适配,保持该维度上和设计图一致; * 当前设备总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = density * density 的意思就是 1 dp 占当前设备多少像素 * 在BaseActivity中引用即可 */ private static float sNoncompatDensity; private static float sNoncompatScaledDensity; public static void setCustomDensity(@NonNull Activity activity, @NonNull final Application application) { DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics(); if (sNoncompatDensity == 0) { sNoncompatDensity = appDisplayMetrics.density; sNoncompatScaledDensity = appDisplayMetrics.scaledDensity; // 防止系统切换后不起作用 application.registerComponentCallbacks(new ComponentCallbacks() { @Override public void onConfigurationChanged(Configuration newConfig) { if (newConfig != null && newConfig.fontScale > 0) { sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity; } } @Override public void onLowMemory() { } }); } float targetDensity = appDisplayMetrics.widthPixels / 360; // 防止字体变小 float targetScaleDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity); int targetDensityDpi = (int) (160 * targetDensity); appDisplayMetrics.density = targetDensity; appDisplayMetrics.scaledDensity = targetScaleDensity; appDisplayMetrics.densityDpi = targetDensityDpi; final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics(); activityDisplayMetrics.density = targetDensity; activityDisplayMetrics.scaledDensity = targetScaleDensity; activityDisplayMetrics.densityDpi = targetDensityDpi; } }