Android:'dp'到'px'转换?

时间:2011-09-13 13:33:04

标签: android user-interface

我正在阅读这篇文章:http://developer.android.com/guide/practices/screens_support.html

它表示Android用于将 dp 单位转换为 px 单位的公式如下:

    px = dp * (dpi / 160)

本文还给出了dpi为240时的示例,它给出了px = 1.5(我正在计算单个dp像素)

然而,1.5究竟是什么意思?一旦px单位实际上是物理设备像素,Android会绘制1或2个像素吗?

4 个答案:

答案 0 :(得分:15)

这取决于具体情况。

如果在隐含大小的上下文中使用 dp 值,例如android:layout_width属性,则将使用为Resources.getDimensionPixelSize()描述的逻辑。也就是说, px 值将四舍五入为最接近的整数值,特殊情况是 px > 0,那么实际值至少为1.

如果在隐含偏移的上下文中使用 dp 值,就像Inset Drawable的android:insetLeft属性一样,将使用为Resources.getDimensionPixelOffset()描述的逻辑。也就是说, px 值将被简单地截断为整数值。

有时会使用未修改的浮点值,例如Shape Drawable中android:dashWidth标记的<stroke/>属性,但这种情况非常罕见。通常使用大小或偏移逻辑,即使可以使用浮点值。

答案 1 :(得分:2)

如果我读到的内容是正确的,1.5px意味着单个'1'像素是指定的颜色,并且围绕它的像素的.5将与'1'像素和旁边的像素混合它

E.g。

| A | AB | B |

A是1.5px,B是1.5x,因此中间的像素是两者的混合。

因此,使用它,彼此相邻的两个像素将被混合在一起,例如1px显示器

| X | Y |

现在显示1.5px:

| XY | YX |它变成了两者的混合!但是设置为X的像素将比设置为Y的像素更多X

答案 2 :(得分:1)

px是一个像素。与尺度无关的像素(sp)和与密度无关的像素(dip),您希望将sp用于字体大小,并将其用于其他所有内容。

浸== DP

从这里http://developer.android.com/guide/topics/resources/more-resources.html#Dimension

px
Pixels - corresponds to actual pixels on the screen.

in
Inches - based on the physical size of the screen.

mm
Millimeters - based on the physical size of the screen.

pt
Points - 1/72 of an inch based on the physical size of the screen.

dp
Density-independent Pixels - an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. Note: The compiler accepts both "dip" and "dp", though "dp" is more consistent with "sp".

sp
Scale-independent Pixels - this is like the dp unit, but it is also scaled by the user's font size preference. It is recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and user's preference.

答案 3 :(得分:0)

我认为这是最好的解决方案,因为它是标准方法:

int valueInPx =(int)TypedValue.applyDimension(             TypedValue.COMPLEX_UNIT_PX,valueInDp,getResources()。getDisplayMetrics());