px、dip、dp 和 sp 之间有什么区别?

6353

px, dip, dp, 和sp这些单位有什么不同?


81
这是关于 Android 中 px、dip、dp 和 sp 的有用区别,详见:http://developer.android.com/guide/topics/resources/more-resources.html#Dimension - NagarjunaReddy
28
在我看来,这个巧妙的转换器展示了最好的效果。它还非常有用,可以用于从Photoshop导出精灵或为物理尺寸设计布局。 - Paul Lammertsma
如何以编程方式在pxdpsp之间进行转换 - Suragch
3
材料设计与像素密度 https://material.io/design/layout/understanding-layout.html#pixel-density - Shomu
@PaulLammertsma 转换器的 pt 是错误的吗?据我理解,pt 与 dpi 有关,但它总是 72? - Amos
显示剩余2条评论
33个回答

6195
根据Android开发者文档:
  1. px
    像素 - 对应于屏幕上的实际像素。

  2. in
    英寸 - 基于屏幕的物理尺寸。
    1英寸或2.54厘米

  3. mm
    > 毫米 - 基于屏幕的物理尺寸。

  4. pt
    > - 基于屏幕的物理尺寸,1/72英寸。

  5. dpdip
    > 密度无关像素 - 这是一个抽象单位,基于屏幕的物理密度。这些单位相对于160dpi屏幕,所以在160dpi屏幕上,一个dp等于一个像素。dp到像素的比例会随着屏幕密度而变化,但不一定成正比例。注意:编译器接受“dip”和“dp”,虽然“dp”更符合“sp”的一致性。

  6. sp
    > 可缩放像素比例独立像素 - 这类似于dp单位,但它还会根据用户的字体大小偏好进行缩放。建议您使用此单位来指定字体大小,以便进行调整。针对屏幕密度和用户偏好,需要使用sp单位。需要注意的是,Android文档对sp的含义并不一致,其中一个文档表示它是“无缩放独立像素”,而另一个文档则表示它是“可缩放像素”。

    根据Understanding Density Independence In Android文章中的表格,不同的屏幕密度将会有不同的物理尺寸和像素尺寸,其中ldpi表示120dpi,mdpi表示160dpi,hdpi表示240dpi,xhdpi表示320dpi,xxhdpi表示480dpi,xxxhdpi表示640dpi。640 dpi 0.5 x 0.5 英寸 0.5 英寸 * 640 dpi = 320x320 像素
    单位 描述 每物理英寸的单位数 密度无关吗? 在每个屏幕上大小相同吗?
    px 像素 变化
    in 英寸 1
    mm 毫米 25.4
    pt 72
    dp 密度无关像素 ~160
    sp 缩放无关像素 ~160

    更多信息也可以在Google设计文档中找到。


为什么 dp 在最后一列的表格中有一个 "no"?它不是与 mm、pt 和 in 相同,但 dp 的常数尺寸为 1/160 英寸。我的意思是,你可以更改设备的屏幕和其 dpi,但 dp 的物理尺寸将保持不变,对吗? - VanechikSpace

745
几乎关于如何实现最佳支持不同大小和密度的多个屏幕的所有内容都在这里得到了很好的记录:

屏幕尺寸
实际物理尺寸,以屏幕对角线测量。为了简单起见,Android将所有实际的屏幕尺寸分为四个通用大小:小型、普通、大型和超大型。

屏幕密度
屏幕物理区域内的像素数;通常称为dpi(每英寸点数)。例如,“低”密度屏幕在给定的物理区域内具有比“普通”或“高”密度屏幕更少的像素。为了简单起见,Android将所有实际屏幕密度分为六种通用密度:低、中、高、超高、超超高和超超超高。

方向
从用户的角度来看,屏幕的方向。这是横向或纵向,表示屏幕的纵横比是宽或高。请注意,不仅不同设备默认情况下在不同方向上运行,而且在用户旋转设备时方向也可能发生变化。

分辨率
屏幕上物理像素的总数。在添加对多个屏幕的支持时,应用程序不直接使用分辨率;应用程序只需关注由通用大小和密度组指定的屏幕大小和密度。

密度无关像素(dp)
在定义UI布局时应该使用的虚拟像素单位,以密度无关的方式表达布局尺寸或位置。密度无关像素相当于160dpi屏幕上的一个物理像素,这是系统默认假定为“中等”密度屏幕的基线密度。在运行时,系统会根据实际密度透明地处理dp单位的任何缩放。

屏幕使用中的度量单位是dp。将dp单位转换为屏幕像素非常简单: px = dp *(dpi / 160)。例如,在240 dpi屏幕上,1 dp等于1.5个物理像素。您应该始终使用dp单位来定义应用程序的用户界面,以确保在具有不同密度的屏幕上正确显示您的UI。
如果您认真考虑开发适用于多种设备类型的Android应用程序,那么至少应该阅读一次屏幕支持开发文档。除此之外,了解拥有特定屏幕配置的活动设备的实际数量也是一件好事。

387
我将详细说明dp如何转换为px:
- 在mdpi设备上运行时,一个150 x 150 px的图像将占用屏幕空间的150 x 150 dp。 - 在hdpi设备上运行时,一个150 x 150 px的图像将占用屏幕空间的100 x 100 dp。 - 在xhdpi设备上运行时,一个150 x 150 px的图像将占用屏幕空间的75 x 75 dp。
反过来说,假设您想在应用程序中添加一张图像,并且需要它填充一个100 x 100 dp的控件。您需要为支持的屏幕尺寸创建不同大小的图像:
- mdpi需要一个100 x 100 px的图像 - hdpi需要一个150 x 150 px的图像 - xhdpi需要一个200 x 200 px的图像

字体大小是用dp还是sp表示的?我的应用程序中,某些模态下的文本显示得更大。因此,它会换行或完全占据空间。如何设置字体大小以在Android上显示良好? - sejn

250

此外,您应该清楚理解以下概念:

屏幕尺寸:

实际物理大小,以屏幕对角线来测量。为简单起见,Android将所有实际屏幕尺寸归为四个通用尺寸:小型、普通、大型和特大型。

屏幕密度:

屏幕物理区域内像素的数量;通常称为dpi(每英寸点数)。例如,“低”密度屏幕在给定的物理区域内具有较少的像素,与“正常”或“高”密度屏幕相比。为简单起见,Android将所有实际屏幕密度归为四个通用密度:低、中、高和超高。

方向:

从用户的角度来看,屏幕的方向。这是横向或纵向,表示屏幕的宽高比分别为宽屏或竖屏。请注意,不同设备默认以不同方向操作,并且当用户旋转设备时,方向可以在运行时更改。

分辨率:

屏幕上的物理像素总数。在添加对多个屏幕的支持时,应用程序不直接使用分辨率;应用程序只需关注由通用尺寸和密度组指定的屏幕大小和密度。

密度无关像素(dp):

定义UI布局时应使用的虚拟像素单位,以便以密度无关的方式表示布局尺寸或位置。密度无关像素等效于160 dpi屏幕上的一个物理像素,这是系统假定为“中等”密度屏幕的基准密度。在运行时,系统透明地处理dp单位的任何缩放,根据实际使用的屏幕密度进行必要的缩放。将dp单位转换为屏幕像素很简单:px = dp *(dpi / 160)。例如,在240 dpi屏幕上,1 dp等于1.5个物理像素。

像素。在定义应用程序的用户界面时,应始终使用 dp 单位,以确保在不同密度的屏幕上正确显示您的 UI。

参考文献:Android 开发者网站


217

dpdip,用于所有元素(如margin、padding等)。

sp仅用于{字体大小}。


为了在不同屏幕密度下获得相同的大小,Android会在运行时将这些单位转换为像素,因此您不需要进行复杂的数学计算。


在不同屏幕尺寸上查看pxdpsp之间的差异。

图片描述

来源:《Android编程权威指南》


168

定义

px 或点是物理屏幕上的一个像素。

dpi 是物理屏幕上每英寸的像素数,代表显示器的密度。

Android 为几种密度提供别名名称

  • ldpi(低)〜120dpi
  • mdpi(中)〜160dpi
  • hdpi(高)〜240dpi
    • 2015年大多数设备都在这里
  • xhdpi(超高)〜320dpi
    • Apple iPhone 4/5/6,Nexus 4
  • xxhdpi(特别高)〜480dpi
    • Nexus 5
  • xxxhdpi(特别特别高)〜640dpi

dipdp密度无关像素,即它们根据物理密度对应更多或更少的像素。

  • 1dp = 1px 在 mdpi 上

enter image description here

spsip是指“独立像素”。当在设置 > 辅助功能中打开大号字体选项时,它们会进行缩放。

  • 1sp = 1dp
  • 1sp(大号字体)= 1.2dp

何时使用?

对于文本大小,请使用sp

对于其他所有内容,请使用dp


155

我已计算出以下公式,可将dpi转换为dpsp

此处为图像描述

11
应该使用ppi而不是dpi。 - Prateek

141

来源1

来源2

来源3:(以下是来自来源3的数据)

这些是在XML中定义的尺寸值。尺寸是由数字和跟随其后的度量单位组成的。例如:10px、2in、5sp。Android支持以下度量单位: dp 密度无关像素 - 这是一个抽象的单位,它基于屏幕的物理密度。这些单位相对于160 dpi(每英寸点数)的屏幕,其中1dp大约等于1px。在高密度屏幕上运行时,用于绘制1dp的像素数会按比例缩放适合屏幕dpi的因子。同样,在低密度屏幕上,用于1dp的像素数会缩小。dp到像素的比率将随着屏幕密度而改变,但不一定是直接成比例的。使用dp单位(而不是px单位)是在布局中使视图尺寸针对不同的屏幕密度正确调整的简单解决方案。换句话说,它提供了UI元素在不同设备上的真实大小的一致性。 sp 可缩放独立像素 - 这类似于dp单位,但也根据用户的字体大小偏好进行缩放。建议您在指定字体大小时使用此单位,以便它们能够针对屏幕密度和用户的偏好进行调整。 pt 点 - 基于屏幕的物理尺寸的1/72英寸。 px 像素 - 对应于屏幕上的实际像素。不建议使用此度量单位,因为实际表示可能因设备而异;每个设备的每英寸像素数可能不同,并且可用于屏幕上的总像素数可能更多或更少。 mm 毫米 - 基于屏幕的物理尺寸。 in 英寸 - 基于屏幕的物理尺寸。
注意:维度是一种简单的资源,它使用name属性中提供的值进行引用(而不是XML文件的名称)。因此,您可以在一个XML文件中的一个元素下将维度资源与其他简单资源组合在一起。

11
此外:這個回答有什麼附加價值嗎?似乎沒有任何其他回答中沒提到的內容。 - laalto

130

基本上,px只在需要在屏幕上显示一个像素的情况下应用,例如在分割线的情况下:

在>160 dpi的情况下,可能会出现2-3个像素,

在>120 dpi的情况下,四舍五入为0。


107

在哪里使用什么&像素(px)和密度无关像素(dp)之间的关系?

密度无关像素(dp)

定义UI布局时应使用的虚拟像素单位,以一种密度无关的方式表达布局尺寸或位置。正如上面所述,密度无关的像素相当于160 dpi屏幕上的一个物理像素,这是系统对于“中等”密度屏幕的基线密度假设。在运行时,系统根据实际使用的屏幕密度自动处理dp单位的任何缩放。将dp单位转换为屏幕像素非常简单:

px = dp * (dpi / 160).

例如,在240 dpi屏幕上,1 dp等于1.5个物理像素。您应始终使用dp单位来定义应用程序的UI,以确保在不同密度的屏幕上正确显示您的UI。

了解像素到dp及其反向转换非常重要(特别是为创意团队提供准确的dp值)。

dp = px * 160 / dpi

MDPI = 160 dpi || Therefore, on MDPI 1 px = 1 dp
For example, if you want to convert 20 pixel to dp, use the above formula,
dp = 20 * 160 / 160 = 20.
So, 20 pixel = 20 dp.

HDPI = 240 dpi - So, on HDPI 1.5 px = 1 dp
XHDPI = 320 dpi - So, on XHDPI 2 px = 1 dp
XXHDPI = 480 dpi - So, on XXHDPI 3 px = 1 dp

For example, let us consider Nexus 4.
If 24 pixels to be converted to dp and if it is a Nexus 4 screen, developers can
convert it to dp easily by the following calculation :
dp = 24 * 160 / 320 = 12 dp
Screen dimension:
768 x 1280 pixel resolution (320 ppi or 320dpi)
Optional (screen size):
 4.7" diagonal
  • 尽量从创意团队获得所有像素值为偶数的设计文件。否则,在乘以0.5时可能会丢失精度。

px

如上所述,尽量避免在布局文件中使用 px 单位。但是有些情况下需要使用 px ,例如 ListView 分割线,这里使用 px 作为分割线可以使得在所有屏幕分辨率下都能展示为一像素线。

sp

用 sp 作为字体大小单位,这样当设备字体大小改变(即:显示 -> 设备字体)时,应用内的字体大小也会随之改变。如果您想在应用中保持静态大小的字体,可以使用 dp 来指定字体的大小,这样它将永远不会改变。开发人员可能会在某些特定的屏幕上遇到此类要求,对于这种情况,可以使用 dp 而不是 sp。在所有其他情况下,推荐使用 sp。


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