px, dip, dp, 和sp这些单位有什么不同?
px, dip, dp, 和sp这些单位有什么不同?
px
像素 - 对应于屏幕上的实际像素。
in
英寸 - 基于屏幕的物理尺寸。
1英寸或2.54厘米
mm
> 毫米 - 基于屏幕的物理尺寸。
pt
> 点 - 基于屏幕的物理尺寸,1/72英寸。
dp 或 dip
> 密度无关像素 - 这是一个抽象单位,基于屏幕的物理密度。这些单位相对于160dpi屏幕,所以在160dpi屏幕上,一个dp等于一个像素。dp到像素的比例会随着屏幕密度而变化,但不一定成正比例。注意:编译器接受“dip”和“dp”,虽然“dp”更符合“sp”的一致性。
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 像素
> 可缩放像素或比例独立像素 - 这类似于dp单位,但它还会根据用户的字体大小偏好进行缩放。建议您使用此单位来指定字体大小,以便进行调整。针对屏幕密度和用户偏好,需要使用sp
单位。需要注意的是,Android文档对sp
的含义并不一致,其中一个文档表示它是“无缩放独立像素”,而另一个文档则表示它是“可缩放像素”。
单位 描述 每物理英寸的单位数 密度无关吗? 在每个屏幕上大小相同吗? px 像素 变化 否 否 in 英寸 1 是 是 mm 毫米 25.4 是 是 pt 点 72 是 是 dp 密度无关像素 ~160 是 否 sp 缩放无关像素 ~160 是 否 更多信息也可以在Google设计文档中找到。
屏幕尺寸
实际物理尺寸,以屏幕对角线测量。为了简单起见,Android将所有实际的屏幕尺寸分为四个通用大小:小型、普通、大型和超大型。屏幕密度
屏幕物理区域内的像素数;通常称为dpi(每英寸点数)。例如,“低”密度屏幕在给定的物理区域内具有比“普通”或“高”密度屏幕更少的像素。为了简单起见,Android将所有实际屏幕密度分为六种通用密度:低、中、高、超高、超超高和超超超高。方向
从用户的角度来看,屏幕的方向。这是横向或纵向,表示屏幕的纵横比是宽或高。请注意,不仅不同设备默认情况下在不同方向上运行,而且在用户旋转设备时方向也可能发生变化。
分辨率
屏幕上物理像素的总数。在添加对多个屏幕的支持时,应用程序不直接使用分辨率;应用程序只需关注由通用大小和密度组指定的屏幕大小和密度。
屏幕使用中的度量单位是dp。将dp单位转换为屏幕像素非常简单:密度无关像素(dp)
在定义UI布局时应该使用的虚拟像素单位,以密度无关的方式表达布局尺寸或位置。密度无关像素相当于160dpi屏幕上的一个物理像素,这是系统默认假定为“中等”密度屏幕的基线密度。在运行时,系统会根据实际密度透明地处理dp单位的任何缩放。
px = dp *(dpi / 160)
。例如,在240 dpi屏幕上,1 dp等于1.5个物理像素。您应该始终使用dp单位来定义应用程序的用户界面,以确保在具有不同密度的屏幕上正确显示您的UI。此外,您应该清楚理解以下概念:
屏幕尺寸:
实际物理大小,以屏幕对角线来测量。为简单起见,Android将所有实际屏幕尺寸归为四个通用尺寸:小型、普通、大型和特大型。
屏幕密度:
屏幕物理区域内像素的数量;通常称为dpi(每英寸点数)。例如,“低”密度屏幕在给定的物理区域内具有较少的像素,与“正常”或“高”密度屏幕相比。为简单起见,Android将所有实际屏幕密度归为四个通用密度:低、中、高和超高。
方向:
从用户的角度来看,屏幕的方向。这是横向或纵向,表示屏幕的宽高比分别为宽屏或竖屏。请注意,不同设备默认以不同方向操作,并且当用户旋转设备时,方向可以在运行时更改。
分辨率:
屏幕上的物理像素总数。在添加对多个屏幕的支持时,应用程序不直接使用分辨率;应用程序只需关注由通用尺寸和密度组指定的屏幕大小和密度。
密度无关像素(dp):
像素。在定义应用程序的用户界面时,应始终使用 dp 单位,以确保在不同密度的屏幕上正确显示您的 UI。定义UI布局时应使用的虚拟像素单位,以便以密度无关的方式表示布局尺寸或位置。密度无关像素等效于160 dpi屏幕上的一个物理像素,这是系统假定为“中等”密度屏幕的基准密度。在运行时,系统透明地处理dp单位的任何缩放,根据实际使用的屏幕密度进行必要的缩放。将dp单位转换为屏幕像素很简单:px = dp *(dpi / 160)。例如,在240 dpi屏幕上,1 dp等于1.5个物理像素。
参考文献:Android 开发者网站
dp
是dip
,用于所有元素(如margin、padding等)。
sp
仅用于{字体大小}。
在不同屏幕尺寸上查看px
、dp
和sp
之间的差异。
px 或点是物理屏幕上的一个像素。
dpi 是物理屏幕上每英寸的像素数,代表显示器的密度。
Android 为几种密度提供别名名称
dip 或 dp 是密度无关像素,即它们根据物理密度对应更多或更少的像素。
sp或sip是指“独立像素”。当在设置 > 辅助功能中打开大号字体选项时,它们会进行缩放。
对于文本大小,请使用sp。
对于其他所有内容,请使用dp。
来源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 英寸 - 基于屏幕的物理尺寸。基本上,px只在需要在屏幕上显示一个像素的情况下应用,例如在分割线的情况下:
在>160 dpi的情况下,可能会出现2-3个像素,
在>120 dpi的情况下,四舍五入为0。
定义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
如上所述,尽量避免在布局文件中使用 px 单位。但是有些情况下需要使用 px ,例如 ListView 分割线,这里使用 px 作为分割线可以使得在所有屏幕分辨率下都能展示为一像素线。
用 sp 作为字体大小单位,这样当设备字体大小改变(即:显示 -> 设备字体)时,应用内的字体大小也会随之改变。如果您想在应用中保持静态大小的字体,可以使用 dp 来指定字体的大小,这样它将永远不会改变。开发人员可能会在某些特定的屏幕上遇到此类要求,对于这种情况,可以使用 dp 而不是 sp。在所有其他情况下,推荐使用 sp。
px
、dp
和sp
之间进行转换 - Suragch