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

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

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


当前回答

从DP到像素

在dimensions .xml中创建一个值

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

以像素为单位获取该值:

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

其他回答

要将dp转换为px,这段代码可能很有用:

public static int dpToPx(Context context, int dp) {
       final float scale = context.getResources().getDisplayMetrics().density;
       return (int) (dp * scale + 0.5f);
    }

你应该像使用像素一样使用dp。他们就是这样;显示独立像素。在中等密度的屏幕上使用相同的数字,在高密度的屏幕上大小将神奇地正确。

然而,听起来你需要的是布局设计中的fill_parent选项。当您希望视图或控件扩展到父容器中的所有剩余大小时,请使用fill_parent。

根据Android开发指南:

px = dp * (dpi / 160)

但通常当你收到以像素表示的设计时,你会希望以另一种方式执行这个操作。所以:

dp = px / (dpi / 160)

如果你在一个240dpi的设备上,这个比例是1.5(如前所述),所以这意味着一个60px的图标在应用程序中等于40dp。

因此,您可以使用以下公式从dp中指定的维度计算正确的像素数量

public int convertToPx(int dp) {
    // Get the screen's density scale
    final float scale = getResources().getDisplayMetrics().density;
    // Convert the dps to pixels, based on density scale
    return (int) (dp * scale + 0.5f);
}

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

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