dp与px之间的转换公式
px = dp * (dpi / 160)
dp = px / (dpi / 160)
其中dpi的获取方式如下
private void getDpi() { DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); Log.d(TAG, "metrics.densityDpi: " + metrics.densityDpi); }
160对应常量DisplayMetrics.DENSITY_DEFAULT
对于LayoutParams
其中的成员width和height都以px为单位,以下是转换为dp的示例
mainLinearLayout = findViewById(R.id.mainLinearLayout); ViewGroup.LayoutParams layoutParams = mainLinearLayout.getLayoutParams(); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int widthInDp = layoutParams.width / (metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); int heightInDp = layoutParams.height / (metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); Log.d(TAG, "widthInDp: " + widthInDp); Log.d(TAG, "heightInDp: " + heightInDp);
封装好的工具类
PixelTool.java
package com.bu_ish.myapp; import android.content.Context; import android.util.DisplayMetrics; import android.util.TypedValue; public class PixelTool { public static int dpToPx(Context context, int dp) { return dp * (context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT); } public static int pxToDp(Context context, int px) { return px / (context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT); } public static float spToPx(Context context, float sp) { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics()); } public static int pxToSp(Context context, float px) { float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (px / fontScale + 0.5f); } }