Android - 什么时候应该将dp转换为像素

时间:2016-01-31 12:50:37

标签: android

我有一个自定义操作栏,我想要一个80岁!它的高度。 所以我用这段代码将布局高度设置为80dp:

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
    xdpi = displayMetrics.xdpi;
x = Math.round(80 * (xdpi / DisplayMetrics.DENSITY_DEFAULT))
... new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, x);

但它在xxxhdpi设备中很大。 当我删除转换并直接使用80pixels值时,似乎没问题, 何时使用转换后的dp以及何时使用直接像素?

修改 问题出在其他地方,我将“80dp”值存储在xml中并使用“context.getResources()。getDimension()”检索它,它似乎在内部将维度转换为像素,而我实际上正在转换转换后的值!我想知道在使用“sp”字体时是否会发生同样的事情....

3 个答案:

答案 0 :(得分:1)

你正在做正确的事情,只是你的转换错了,它应该是这样的:

float scale = context.getResources().getDisplayMetrics().density;
x = Math.round(80 * scale);
... new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, x);

答案 1 :(得分:0)

将dp转换为像素:

public int dpToPx(int dp) {
    DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
    int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));       
    return px;
}

将像素转换为dp:

public int pxToDp(int px) {
    DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
    int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
    return dp;
}

答案 2 :(得分:0)

像素到Dp转换器

public static float pxToDp(float px) {
        float densityDpi = Resources.getSystem().getDisplayMetrics().densityDpi;
        return px / (densityDpi / 160f);
    }

Dp到像素转换器

 public static int dpToPx(int dp) {
        float density = Resources.getSystem().getDisplayMetrics().density;
        return Math.round(dp * density);
    }