将像素转换为dp

956

我已经按像素为 Pantech 设备创建了应用程序,其分辨率为 480x800

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

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


1
如果您想进行一次性转换(例如从Photoshop导出精灵),这里有一个不错的转换器 - Paul Lammertsma
3
pxdpsp 转换公式:在 Android 中,px 表示像素,是屏幕上的一个点;dp 表示密度无关像素,它会根据屏幕密度进行缩放;sp 表示可缩放像素,通常用于文本字号大小。以下是相互转化的公式:
  • px to dp: dp = px / (dpi / 160)
  • dp to px: px = dp * (dpi / 160)
  • sp to px: px = sp * (dpi / 160)
其中,dpi 是指每英寸包含的像素数。
- Suragch
http://web.archive.org/web/20140808234241/http://developer.android.com/guide/practices/screens_support.html#dips-pels - caw
35个回答

48

DP 转像素

dimens.xml 文件中创建一个数值

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

将该值以 像素 为单位获取:

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

41
你因此可以使用以下公式来计算从以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);
}

4
这会将dp转换为像素值,但是您将方法命名为convertToDp - Qwertie
5
这里解释了+0.5f的含义--> http://developer.android.com/guide/practices/screens_support.html#dips-pels。它用于四舍五入到最接近的整数。 - Bae
唯一正确的答案。您可以添加来源 https://developer.android.com/guide/practices/screens_support.html#screen-independence - user25
1
请点击以下链接查看有关问题的内容:http://web.archive.org/web/20140808234241/http://developer.android.com/guide/practices/screens_support.html#dips-pels - caw

35

你应该使用这个。作为额外的奖励,它也会做SP。 - Mark Renouf
2
resultPix 应该是 int 类型。int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics()) - vovahost

25

Kotlin

fun convertDpToPixel(dp: Float, context: Context): Float {
    return dp * (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
}

fun convertPixelsToDp(px: Float, context: Context): Float {
    return px / (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
}

Java

public static float convertDpToPixel(float dp, Context context) {
    return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

public static float convertPixelsToDp(float px, Context context) {
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

19

这应该为您提供了dp到像素的转换:

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

以下是将像素转换为dp的方法:

public static int pxToDp(int px)
{
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

你不应该使用 Resources.getSystem() 来完成这个任务。 - EpicPandaForce

12

如果您在values/dimen中具有尺寸,则最好的方法是直接从getDimension()方法中获取尺寸,它将返回已转换为像素值的尺寸。

context.getResources().getDimension(R.dimen.my_dimension)

仅为更好地解释此事,

getDimension(int resourceId) 

将以浮点数形式返回已转换为像素的尺寸。

getDimensionPixelSize(int resourceId)

将返回相同的值,但被截断为整数,以便作为整数使用。

参见Android 参考文献


10

Kotlin:

fun spToPx(ctx: Context, sp: Float): Float {
    return sp * ctx.resources.displayMetrics.scaledDensity
}

fun pxToDp(context: Context, px: Float): Float {
    return px / context.resources.displayMetrics.density
}

fun dpToPx(context: Context, dp: Float): Float {
    return dp * context.resources.displayMetrics.density
}

Java:

public static float spToPx(Context ctx,float sp){
    return sp * ctx.getResources().getDisplayMetrics().scaledDensity;
}

public static float pxToDp(final Context context, final float px) {
    return px / context.getResources().getDisplayMetrics().density;
}

public static float dpToPx(final Context context, final float dp) {
    return dp * context.getResources().getDisplayMetrics().density;
}

如何将px转换为sp?@Max Base - hemandroid

9

像这样:

public class ScreenUtils {

    public static float dpToPx(Context context, float dp) {
        if (context == null) {
            return -1;
        }
        return dp * context.getResources().getDisplayMetrics().density;
    }

    public static float pxToDp(Context context, float px) {
        if (context == null) {
            return -1;
        }
        return px / context.getResources().getDisplayMetrics().density;
    }
}

根据上下文,返回浮点数值,静态方法。

来源:https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15


7
float scaleValue = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scaleValue + 0.5f);

2
这不就是其他回答中涵盖的内容吗? - TZHX

7

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

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

只有当你真的经常进行转换时,它才有意义。在我的情况下,我确实经常这样做。 - Pavel
160f是什么?为什么要使用它,为什么是160? - dephinera
160 => 160dpi,这是为了转换度量单位而使用的公式。 - xAqweRx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接