公式px到dp,dp到px android

Bra*_*ram 145 android formula density-independent-pixel

我试图计算可变数量的像素到密度独立像素,反之亦然.

此公式(px to dp): dp = (int)(px / (displayMetrics.densityDpi / 160));不适用于小型设备,因为它除以零.

这是我的dp to px公式:

px = (int)(dp * (displayMetrics.densityDpi / 160));
Run Code Online (Sandbox Code Playgroud)

有人可以给我一些指示吗?

Bac*_*chi 314

注意:上面广泛使用的解决方案基于displayMetrics.density.但是,文档解释说这个值是一个舍入值,与屏幕"桶"一起使用.例如.在我的Nexus 10上,它返回2,其中实际值为298dpi(实际)/ 160dpi(默认值)= 1.8625.

根据您的要求,您可能需要精确的转换,可以这样实现:

[编辑]这并不意味着与Android的内部dp单元混合,因为这当然仍然基于屏幕存储桶.如果您希望在不同设备上呈现相同实际大小的单位,请使用此选项.

将dp转换为像素:

public int dpToPx(int dp) {
    DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
    return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));     
}
Run Code Online (Sandbox Code Playgroud)

将像素转换为dp:

public int pxToDp(int px) {
    DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
    return Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
}
Run Code Online (Sandbox Code Playgroud)

请注意,有xdpi和ydpi属性,您可能想要区分,但我无法想象这些值差别很大的理智显示.

  • 这不会在许多设备(包括您的Nexus 10)上计算dp/px的正确值!如你所说displayMetrics.density四舍五入到最近的屏幕桶,但dp单位也是如此!尝试绘制一个160dp宽的对象,在其下方绘制另一个dpToPx(160)像素宽的对象,您将看到两个对象的大小不同.还有一些手机(如Galaxy Mini和Galaxy S3 Mini)报告的xdpi/ydpi值完全错误,因此在这些手机上你的方法会返回完全错误的结果. (8认同)

Bra*_*ram 103

我通过使用以下公式解决了我的问题.愿其他人从中受益.

dp到px:

displayMetrics = context.getResources().getDisplayMetrics();
return (int)((dp * displayMetrics.density) + 0.5);
Run Code Online (Sandbox Code Playgroud)

px到dp:

displayMetrics = context.getResources().getDisplayMetrics();
return (int) ((px/displayMetrics.density)+0.5);
Run Code Online (Sandbox Code Playgroud)

  • @Vame添加0.5用于将UP舍入到最接近的整数值.添加0.5,然后将计算结果转换为int,使其截断尾数并将特性保留为正确舍入的整数值. (26认同)
  • 它与Android开发者网站上采用的解决方案相同,所以我猜它是正确的:).[http://developer.android.com/guide/practices/screens_support.html#dips-pels](http://developer.android.com/guide/practices/screens_support.html#dips-pels) (5认同)
  • 这并不总是正确的.当我有两个布局,一个在另一个内,然后我圆角的每个视图(一个通过使用dp,其他转换为dp)角落不匹配! (3认同)

Kan*_*esh 34

px到dp:

int valueInpx = ...;
int valueInDp= (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, valueInpx , getResources()
                .getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)

  • 这是从DP到PX,但有了这个更正:`typedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,valueInDp,getResources().getDisplayMetrics());`是从PX到DP,这也是最好的答案 (7认同)

Hir*_*tel 28

高效的方式

DP到像素:

private int dpToPx(int dp)
{
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}
Run Code Online (Sandbox Code Playgroud)

像素到DP:

private int pxToDp(int px)
{
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你.

  • 更好,因为没有必要使用Context :)谢谢. (4认同)
  • 最佳答案!不幸的是,“标记为正确的”答案是错误的。特别是因为它使用了“ displayMetrics.xdpi”,这在任何设备上都是不同的。令人遗憾的是,这个错误的答案最具有争议。 (2认同)

pel*_*lus 27

只需调用getResources().getDimensionPixelSize(R.dimen.your_dimension)dp单位转换为像素

  • 根据文档,这与getDimension()相同,除了返回的值转换为整数像素以用作大小.大小转换涉及舍入基值,并确保非零基值的大小至少为一个像素. (3认同)

Pra*_*dro 14

使用此功能

private int dp2px(int dp) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)


Mal*_*ngh 6

使用这些 Kotlin 扩展:

/**
 * Converts Pixel to DP.
 */
val Int.pxToDp: Int
    get() = (this / Resources.getSystem().displayMetrics.density).toInt()

/**
 * Converts DP to Pixel.
 */
val Int.dpToPx: Int
    get() = (this * Resources.getSystem().displayMetrics.density).toInt()
Run Code Online (Sandbox Code Playgroud)


ct_*_*rob 5

px = dp * (dpi / 160)

dp = px * (160 / dpi)
Run Code Online (Sandbox Code Playgroud)

  • `(displayMetrics.densityDpi/160)` - 这个部分在小型设备上可以得到0,在那里计算例如`120/160`,两个值都是int,结果为0.最终为`(int)(px/0)`. (2认同)