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值(获取了当前手机的手机密度信息)

原文地址:https://www.cnblogs.com/buyishi/p/10537109.html