我已经为分辨率为480x800的Pantech设备创建了以像素为单位的高度和宽度的应用程序。

我需要转换G1设备的高度和宽度。 我认为将其转换为dp将解决问题,并为两个设备提供相同的解决方案。

有没有什么简单的方法将像素转换为dp? 有什么建议吗?


当前回答

上面有很多很棒的解决方案。然而,我发现最好的解决方案是谷歌的设计:

https://design.google.com/devices/

其他回答

float density = context.getResources().getDisplayMetrics().density;
float px = someDpValue * density;
float dp = somePxValue / density;

密度=

.75在ldpi (120 dpi) 1.0对mdpi (160 dpi;基线) 1.5在hdpi (240 dpi) 2.0 on xhdpi (320 dpi) 3.0 on xxhdpi (480 dpi) 4.0在xxxhdpi (640 dpi)

使用这个在线转换器来处理dpi值。

编辑: dpi桶与密度之间似乎不是1:1的关系。看起来Nexus 5X是xxhdpi的密度值是2.625(而不是3)。你可以在设备指标中自己查看。

从DP到像素

在dimensions .xml中创建一个值

<dimen name="textSize">20dp</dimen>

以像素为单位获取该值:

int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.textSize);

上面有很多很棒的解决方案。然而,我发现最好的解决方案是谷歌的设计:

https://design.google.com/devices/

如果你在开发一个性能关键的应用程序,请考虑以下优化类:

public final class DimensionUtils {

    private static boolean isInitialised = false;
    private static float pixelsPerOneDp;

    // Suppress default constructor for noninstantiability.
    private DimensionUtils() {
        throw new AssertionError();
    }

    private static void initialise(View view) {
        pixelsPerOneDp = view.getResources().getDisplayMetrics().densityDpi / 160f;
        isInitialised = true;
    }

    public static float pxToDp(View view, float px) {
        if (!isInitialised) {
            initialise(view);
        }

        return px / pixelsPerOneDp;
    }

    public static float dpToPx(View view, float dp) {
        if (!isInitialised) {
            initialise(view);
        }

        return dp * pixelsPerOneDp;
    }
}

将dp转换为像素

public static int dp2px(Resources resource, int dp) {
    return (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        dp,resource.getDisplayMetrics()
    );
}

将像素转换为dp。

public static float px2dp(Resources resource, float px)  {
    return (float)TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_PX,
        px,
        resource.getDisplayMetrics()
    );
}

其中resource为context.getResources()。