Android笔记之dp与px之间的转换以及LayoutParams

时间:2023-03-09 13:24:32
Android笔记之dp与px之间的转换以及LayoutParams

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);
}
}

参考博文:LayoutParams — 设置参数dp值(获取了当前手机的手机密度信息)