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

What is the difference between px, dip, dp, and sp?

提问人:capecrawler 提问时间:1/8/2010 最后编辑:Mateen Ulhaqcapecrawler 更新时间:10/21/2023 访问量:1482231

问:

计量单位之间有什么区别 PX、DIP、DP 和 SP?

Android 布局 用户界面 尺寸 测量单位

评论

81赞 NagarjunaReddy 5/25/2012
这是在 android 中使用 px、dip、dp 和 sp 之间的完全区别 [ developer.android.com/guide/topics/resources/...
28赞 Paul Lammertsma 7/1/2014
在我看来,这个漂亮的转换器最好地展示了它。它对于从 Photoshop 导出精灵或设计物理尺寸布局也非常有用。
0赞 Suragch 7/15/2017
如何以编程方式在 pxdpsp 之间进行转换
0赞 Gangadhar Lahane 9/13/2017
来自 Android 开发者网站 developer.android.com/guide/practices/screens_support.html
3赞 Shomu 10/4/2018
具有像素密度 material.io/design/layout/ 的材料设计

答:

6199赞 34 revs, 31 users 17%Steven Byle #1

来自 Android 开发者文档

  1. px
    像素 - 对应于屏幕上的实际像素

  2. 以英寸为单位
    - 基于屏幕的物理尺寸。
    1 英寸或 2.54 厘米

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

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

  5. dpdip
    > 密度无关像素 - 基于屏幕物理密度的抽象单元。这些单位是相对于 160 DPI 屏幕,因此一个 DP 是 160 DPI 屏幕上的一个像素。dp 与像素的比率会随着屏幕密度的变化而变化,但不一定是成正比的。注意:编译器同时接受“dip”和“dp”,尽管“dp”与“sp”更一致。

  6. sp
    > 可缩放像素与缩放无关的像素 - 这与 dp 单位类似,但它也根据用户的字体大小偏好进行缩放。建议你 在指定字体大小时使用此单位,以便对其进行调整 屏幕密度和用户偏好。请注意,Android 文档对实际代表的含义不一致,一个文档说“与比例无关的像素”,另一个“可缩放像素”。
    sp

摘自了解 Android 中的密度独立性

密度桶 屏幕密度 物理尺寸 像素大小
LDPI型 120 dpi 分辨率 0.5 x 0.5 英寸 0.5 英寸 * 120 dpi = 60x60 像素
MDPI的 160 dpi 分辨率 0.5 x 0.5 英寸 0.5 英寸 * 160 dpi = 80x80 像素
HDPI的 240 dpi 0.5 x 0.5 英寸 0.5 英寸 * 240 dpi = 120x120 像素
xhdpi 320 dpi 分辨率 0.5 x 0.5 英寸 0.5 英寸 * 320 dpi = 160x160 像素
xxhdpi 480 dpi 分辨率 0.5 x 0.5 英寸 0.5 英寸 * 480 dpi = 240x240 像素
xxxhdpi 640 dpi 分辨率 0.5 x 0.5 英寸 0.5 英寸 * 640 dpi = 320x320 像素
单位 描述 单位/物理英寸 与密度无关? 每个屏幕上的物理尺寸都相同?
像素 像素 不同
英寸 1 是的 是的
毫米 毫米 25.4 是的 是的
72 是的 是的
DP型 与密度无关的像素 ~160 是的
sp 缩放独立像素 ~160 是的

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

评论

0赞 VanechikSpace 8/15/2022
为什么 dp 在最后一列的表格中带有“no”?它与 mm、pt 和 in 不一样吗,但 dp 具有 1/160 英寸的恒定大小。我的意思是您可以更改设备的屏幕及其 dpi,但 dp 的物理大小将是相同的,不是吗?
745赞 Bruiser 2/25/2011 #2

关于这一点以及如何实现对不同尺寸和密度的多个屏幕的最佳支持,几乎所有内容都在这里得到了很好的记录:

屏幕尺寸 实际物理尺寸
,以屏幕的对角线来衡量。 为简单起见,Android 将所有实际屏幕尺寸分为四种 通用尺寸:小号、正常号、大号和超大号。

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

方向
屏幕从用户的角度朝向 视图。这是横向或纵向的,这意味着屏幕的 纵横比分别为宽或高。请注意,不是 只有不同的设备才能通过以下方式在不同的方向上运行 默认值,但当用户 旋转设备。

分辨率
物理像素总数 一个屏幕。添加对多个屏幕的支持时,应用程序会这样做 不直接使用分辨率;应用应关注 仅具有通用指定的屏幕尺寸和密度 大小和密度组。

与密度无关的像素 (dp)
A 虚拟 定义 UI 布局时应使用的像素单位,以表示 以与密度无关的方式布局尺寸或位置。 与密度无关的像素相当于 160 上的一个物理像素 DPI 屏幕,这是系统假定的基线密度 “中等”密度屏幕。在运行时,系统透明地处理 必要时,根据实际密度对 DP 单位进行任何缩放 正在使用的屏幕。dp单位到屏幕像素的转换是 简单:。 例如,在 240 dpi 的屏幕上,1 dp 等于 1.5 个物理像素。在以下情况下,应始终使用 dp 单位 定义应用程序的 UI,以确保 UI 正确显示 不同密度的屏幕。
px = dp * (dpi / 160)

如果您真的想为多种类型的设备开发 Android 应用程序,您应该至少阅读一次屏幕支持开发文档。除此之外,了解具有特定屏幕配置的活动设备的实际数量总是一件好事。

387赞 devmiles.com 8/2/2012 #3

我将详细阐述 dp 究竟是如何转换为 px 的:

  • 如果在 mdpi 设备上运行,则图像将占用屏幕空间。150 x 150 px150 x 150 dp
  • 如果在 hdpi 设备上运行,图像将占用屏幕空间。150 x 150 px100 x 100 dp
  • 如果在 xhdpi 设备上运行,图像将占用屏幕空间。150 x 150 px75 x 75 dp

反之亦然:比如说,你想要向应用程序添加一个图像,并且需要它来填充控件。您需要为支持的屏幕尺寸创建不同尺寸的图像:100 x 100 dp

  • 100 x 100 pxMDPI 的图像
  • 150 x 150 pxHDPI 图像
  • 200 x 200 pxxhdpi 的图像

评论

0赞 sejn 1/25/2021
字体大小是如何定义的?在 DP 还是 SP 中?我有一个应用程序,文本在某些模态中显示得更大。因此,它涉及到下一行或完全占据空间。此字体大小将如何设置为在android中显示为良好
130赞 Joe Plante 9/21/2012 #4

基本上,px 应用的唯一时间是 1 px,也就是说,如果您希望在屏幕上恰好有一个像素,例如在分隔线的情况下:

在 >160 dpi 上,您可能会得到 2-3 像素,

在 >120 dpi 时,它四舍五入为 0。

250赞 Sazzad Hissain Khan 7/27/2013 #5

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

屏幕尺寸:

实际物理尺寸,以屏幕的对角线测量。为简单起见,Android 将所有实际屏幕尺寸分组为 四种通用尺寸:小号、正常号、大号和特大号。

屏幕密度:

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

取向:

从用户的角度来看屏幕的方向。这要么是横向的,要么是纵向的,这意味着 屏幕的纵横比分别为宽或高。注意 不同的设备不仅以不同的方向运行, 默认情况下,但当用户 旋转设备。

分辨率:

屏幕上的物理像素总数。添加对多个屏幕的支持时,应用程序无法直接运行 有分辨率;应用程序应仅关注屏幕 大小和密度,由广义大小和密度指定 组。

与密度无关的像素 (dp):

定义 UI 布局时应使用的虚拟像素单元,用于表示布局尺寸或 以与密度无关的方式定位。与密度无关的像素 相当于 160 dpi 屏幕上的一个物理像素,即 系统为“中等”密度屏幕假定的基线密度。 在运行时,系统透明地处理 dp 的任何缩放 单位,如有必要,基于使用中屏幕的实际密度。 dp单位到屏幕像素的转换很简单:px = dp * (dpi / 160).例如,在 240 dpi 的屏幕上,1 dp 等于 1.5 物理 像素。在定义 应用程序的 UI,以确保您的 UI 在屏幕上正确显示 不同的密度。

参考资料:Android 开发者网站

86赞 Atish Agrawal 8/9/2013 #6

任何与文本大小和外观相关的内容都必须使用 or 。然而,与控件大小、布局等相关的任何内容都必须与 一起使用。spptdp

您可以同时使用两者,也可以在其位置使用。dpdip

67赞 auselen 10/14/2013 #7

从官方文档复制的答案中提到的“用户字体大小偏好”之间的和单位之间的差异可以在运行时通过更改选项来查看。dpspSettings->Accessibility->Large Text

Large Text选项会强制文本变大几倍。1.3

private static final float LARGE_FONT_SCALE = 1.3f;

这当然可能取决于供应商,因为它位于包/应用程序/设置中。

155赞 4 revs, 4 users 50%chaitanya #8

我已经计算了下面的公式来转换为 和dpidpsp enter image description here

评论

11赞 Prateek 1/30/2014
它应该是 ppi 而不是 dpi
141赞 sms247 12/27/2013 #9

来源 1

来源 2

来源 3:(来源 3 的数据如下)

这些是在 XML 中定义的维度值。指定维度 数字后跟度量单位。例如:10px、2in、 5sp。Android 支持以下度量单位:

DP型

与密度无关的像素 - 基于 屏幕的物理密度。这些单位是相对于 160 dpi 的 (每英寸点数)屏幕,其 1dp 大致等于 1px。什么时候 在更高密度的屏幕上运行,用于绘制的像素数 1DP 按适合屏幕 DPI 的系数放大。 同样,在较低密度的屏幕上,使用的像素数 对于 1DP 按比例缩小。dp 与像素的比率将随 屏幕密度,但不一定是成正比的。使用 dp 单位(而不是 px 单位)是制作视图的简单解决方案 布局中的尺寸针对不同的屏幕正确调整大小 密度。换句话说,它为现实世界提供了一致性 跨不同设备的 UI 元素的大小。

sp

与比例无关的像素 - 这类似于 dp 单位,但它也是 按用户的字体大小首选项缩放。建议您使用 这个单位在指定字体大小时,所以它们将被调整 屏幕密度和用户的偏好。

点 - 1/72 英寸,具体取决于屏幕的物理尺寸。

像素

像素 - 对应于屏幕上的实际像素。本单位 不建议测量,因为实际表示可能会有所不同 跨设备;每个设备可能具有不同的像素数 英寸,并且屏幕上可用的总像素数可能更多或更少。

毫米

毫米 - 基于屏幕的物理尺寸。

英寸 - 基于屏幕的物理尺寸。

注意:维度是使用 name 属性(而不是 XML 文件的名称)中提供的值引用的简单资源。因此,您可以将维度资源与其他简单资源合并到一个 XML 文件中的一个元素下。

评论

11赞 laalto 12/27/2013
另外:这个答案的附加值是什么?似乎没有其他答案中没有提到过的东西。
107赞 Arunjyothis 7/9/2014 #10

在哪里使用px和dp之间的关系?

与密度无关的像素 (dp)

定义 UI 布局时应使用的虚拟像素单元,以与密度无关的方式表示布局尺寸或位置。如上所述,与密度无关的像素相当于 160 dpi 屏幕上的一个物理像素,这是系统为“中等”密度屏幕假定的基线密度。在运行时,系统会根据所使用屏幕的实际密度,根据需要透明地处理 dp 单位的任何缩放。dp单位到屏幕像素的转换是 简单:

px = dp * (dpi / 160)。

例如,在 240 dpi 的屏幕上,1 dp 等于 1.5 个物理像素。在定义应用程序的 UI 时,应始终使用 dp 单位,以确保 在不同密度的屏幕上正确显示 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。例如,ListView 分隔线。PX 更适合提供一条单像素线作为所有屏幕分辨率的分隔线。

sp

使用 sp 表示字体大小。然后,只有应用程序内的字体会更改,而设备字体大小会更改(即,在设备上显示 -> 字体)。如果要在应用程序内保留静态大小的字体,可以在 dp 中指定字体尺寸。在这种情况下,它永远不会改变。开发人员可能会对某些特定屏幕有这样的要求,为此,开发人员可以使用 dp 而不是 sp。在所有其他情况下,建议使用 sp。

218赞 Mina Gabriel 10/17/2014 #11

dp是。将其用于所有内容(边距、填充等)。dip

仅用于 {text-size}。sp


为了在不同的屏幕密度上获得相同的尺寸,Android 会在运行时将这些单位转换为像素,因此您无需进行棘手的数学运算。


查看 和 在不同屏幕尺寸上的区别。pxdpsp

Enter image description here

资料来源:Android 编程:大书牧场指南

46赞 DPC 11/14/2014 #12
  • px - 一个像素,与 CSS、JavaScript 等中使用的像素相同。
  • SP - 与比例无关的像素
  • DIP - 与密度无关的像素

通常 sp 用于字体大小,而 dip 用于其他字体大小(也称为 dp)。

评论

0赞 Pedro Pedruzzi 11/5/2021
在 Android 中,“px”表示屏幕上物理像素的大小。在 CSS 中,1 px = 1/96 英寸。不是一回事。
80赞 bharal 11/23/2014 #13

我只会使用 dp。

有很多关于使用“sp”作为字体大小的讨论,虽然我很欣赏这一点,但我认为从设计的角度来看,这不是正确的做法。如果用户有一些不稳定的字体大小选择,你最终可能会破坏你的设计,用户最终会责怪应用程序,而不是他们自己的生活选择。

此外,如果您在 160 dpi 平板电脑上使用 sp-font 应用程序,您会发现一切都在放大......但是你的字体,相比之下会显得很小。这不是一个好看的样子。

虽然“sp”字体的想法是好的,但这是一个糟糕的主意。坚持使用 dp 做任何事情。

评论

1赞 Karu 2/27/2017
您知道应用于的字体缩放因子是一个因子,对吧?任何影响的东西也会影响.也就是说,仍然最好使用而不是如果您的布局非常紧凑并且较大的尺寸不适合 - 最好让文本小于用户想要的文本,而不是完全混乱的布局。但首先,您应该始终努力尊重用户的字体大小偏好 - 即使是最大的设置也不是那么大。spdpspdpsp
59赞 Arunendra 1/16/2015 #14

新闻部 -

  • 每英寸点数
  • 测量屏幕的像素密度。

PX - 像素

  • 用于映射屏幕像素

PT - 点

  • 相对于物理屏幕尺寸,约为 1/72 英寸。

英寸 - 英寸 - 关于物理屏幕尺寸(1 英寸 = 2.54 厘米)。

毫米-毫米 - 关于物理屏幕尺寸。

SP - 与比例无关的像素。

  • 基于用户的字体大小偏好。
  • 字体应为“sp”。

浸-

  • DIP == DP
  • 与密度无关的像素。
  • 它因屏幕密度而异。
  • 在 160 dpi 屏幕中,1 dp = 1 像素。
  • 使用 dp(文本字体大小除外)。

在标准中,使用 dp 和 sp。sp 表示字体大小,dp 表示其他所有内容。

单位换算公式:

px = dp * ( dpi / 160 );

Density Bucket -> Screen Display => Physical Size        => Pixel Size                   

ldpi         -> 120 dpi          => 0.5 x 0.5 in         => 0.5 in * 120 dpi = 60x60 px   

mdpi         -> 160 dpi          => 0.5 x 0.5 in         => 0.5 in * 160 dpi = 80x80 px   

hdpi         -> 240 dpi          => 0.5 x 0.5 in         => 0.5 in * 240 dpi = 120x120 px  

xhdpi        -> 320 dpi          => 0.5 x 0.5 in         => 0.5 in * 320 dpi = 160x160 px  

xxhdpi       -> 480 dpi          => 0.5 x 0.5 in         => 0.5 in * 480 dpi = 240x240 px 

xxxhdpi      -> 640 dpi          => 0.5 x 0.5 in         => 0.5 in * 640 dpi = 320x320 px  

评论

0赞 Arunendra 11/24/2015
根据文档,编译器同时接受“dip”和“dp”,尽管“dp”与“sp”更一致。
99赞 Zephyr 2/14/2015 #15

从下图中可以看出 和 之间的区别,还可以发现 和 无法保证不同屏幕上的物理尺寸相同。pxdppxdp

enter image description here

评论

3赞 Zephyr 9/17/2015
@EnesBattal,我认为因为 dp 不是一个锐利的物理尺寸,它是一个近似值。引用 CapTech 的话:“dp - 这是一个与密度无关的单元,但是单个”dp“的物理尺寸在每个屏幕密度上都大致相同。一英寸大约有 160 个“dp”。根据设备的密度桶,应用缩放因子将“dp”转换为 160 dpi 的像素数。单个“dp”转换为的像素数取决于屏幕上的像素密度和设备所属的密度桶。
3赞 Zephyr 11/26/2015
@RuchirBaronia,我认为 DP 或 DIP 仍然存在于 apk 内部,因为 apk 还不知道它将以哪种屏幕密度运行,因此仍应保留设备独立性。
75赞 Kushal 3/11/2015 #16

sp = 与比例无关的像素

dp = dip = 与密度无关的像素

dpi = 每英寸点数

我们应该避免使用 sp

我们应该使用 dp 来支持多个屏幕。

Android支持不同的屏幕分辨率

  • LDPI(低)~120 dpi
  • MDPI(中)~160 dpi
  • HDPI(高)~240 dpi
  • xhdpi(超高)~320 dpi
  • XXHDPI(超高)~480 dpi
  • xxxhdpi(超高)~640 dpi

120 dp ldpi 设备在 1 英寸尺寸中具有 120 像素。

其他密度也一样......

作为软件工程师,我们应该使用这个转换公式:

像素 = dp * (密度 / 160)

因此,240 dpi 设备的 1 dp 将具有 = 1 * (240/160) = 3/2 = 1.5 像素。

480 dpi 设备的 1 dp 将具有 = 1 * (480/160) = 3 像素。

利用这种 1.5 像素和 3 像素的知识,软件工程师可以设计不同密度的布局。

要检查任何设备的屏幕参数:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

Toast.makeText(
    this,
    "4:" + metrics.heightPixels + "," + metrics.density + ","
    + metrics.densityDpi, Toast.LENGTH_LONG).show();

评论

0赞 Kushal 3/16/2015
非常好的理解教程是:http:/vinsol.com/blog/2014/11/20/tips-for-designers-from-a-developer
5赞 ci_ 3/20/2015
“我们应该避免使用sp”这是为什么呢?在处理字体大小时应使用 sp,因为它考虑了用户的首选文本大小,developer.android.com/training/multiscreen/screendensities.html
0赞 Kushal 3/20/2015
我已经回答了关于布局透视的问题。请阅读您提供的链接“因此,在定义文本大小时应使用此度量单位(但绝不能用于布局大小)。
0赞 ci_ 3/20/2015
问题是“Android 中 px、dp、dip 和 sp 之间的区别?”你的回答是“我们应该避免使用 sp”。任何地方都没有提到“布局透视”。
0赞 Kushal 11/24/2015
是的。。DP 和 DIP 是一样的......可互换使用...我的答案能解决你的问题吗?
49赞 Dan Borza 4/30/2015 #17

以下是 Android 使用的公式:

px = dp * (dpi / 160)

其中 dpi 是以下屏幕密度之一。有关所有可能密度的列表,请访问此处

它定义了“DENSITY_*”常量。

  • LDPI(低)~120dpi
  • MDPI(中)~160dpi
  • HDPI(高)~240dpi
  • xhdpi(超高)~320dpi
  • XXHDPI(超高)~480dpi
  • xxxhdpi(超-超-超-高)~640dpi

取自这里

如果您知道屏幕 dpi,这将解决在 px 和 dp 之间转换时的很多混淆。

因此,假设您想要 hdpi 屏幕的 60 dp 图像,那么 60 dp 的物理像素大小为:

px = 60 * (240 / 160)
34赞 IntelliJ Amiya 5/10/2015 #18

1) dp:(与密度无关的像素)

以一个 dp 单位表示的像素数将随着屏幕分辨率的增加而增加(当您每英寸有更多的点/像素时)。相反,在分辨率较低的设备上,以 dp 为单位表示的像素数将减少。由于这是一个相对单位,因此需要有一个基线进行比较。此基线是 160 dpi 屏幕。这是等式:px = dp * (dpi / 160).


2) sp:(缩放无关像素)

本机根据屏幕 dpi(类似于 dp)以及用户的字体大小偏好进行缩放。


3) px:(像素)

屏幕上的实际像素或点。


有关更多详细信息,您可以访问

Android 开发人员指南 > Dimension
Android 开发人员指南 > 屏幕

31赞 Rajesh Jadav 10/7/2015 #19

Android 中的屏幕尺寸分为 、 、 和 类别。屏幕密度是屏幕区域(如英寸)内的像素数量。通常以每英寸点数 () 为单位。ldpimdpihdpixhdpixxhdpixxxhdpidpi

PX(Pixels):

  • 我们通常的标准像素映射到屏幕像素。 适用于绝对像素。如果要以绝对像素表示宽度或高度,则可以使用此方法。不推荐。px

DP/DIP(Density pixels / Density independent pixels):

  • dip == dp.在早期的 Android 版本中,使用了 dip,后来改为 .这是 的替代方法。dppx

  • 通常我们从不使用,因为它是绝对值。如果您用于设置宽度或高度,并且该应用程序正在下载到不同屏幕大小的设备中,则该视图将不会根据屏幕原始大小拉伸。pxpx

  • dp强烈建议用 代替 。如果您想提及宽度和高度,请使用它来根据屏幕尺寸动态增长和收缩。pxdp

  • 如果我们给出 ,Android 将在 160 像素大小的屏幕的基础上自动计算像素大小。dp/dip

SP(Scale independent pixels):

  • 根据用户的字体大小偏好进行缩放。字体应使用 .sp

  • 当提到适合各种屏幕尺寸的字体大小时,请使用 .这类似于 。特别用于字体大小,以根据屏幕大小动态增长和缩小spdpsp

Android Documentation说道:

指定尺寸时,请始终使用“或”单位”。A 是 与密度无关的像素,对应于 像素为 160 .An 是相同的基本单位,但按 用户首选的文本大小(它是与比例无关的像素),因此 定义文本大小时应使用此度量单位dpspdpdpisp

168赞 rds 1/11/2016 #20

定义

px 或 dot 是物理屏幕上的像素

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

Android 为多种密度提供别名

  • LDPI(低)~120dpi
  • MDPI(中)~160dpi
  • HDPI(高)~240dpi
    • 2015 年的大多数设备都在这里
  • xhdpi(超高)~320dpi
    • 苹果iPhone 4/5/6、Nexus 4
  • XXHDPI(超高)~480dpi
    • Nexus 5的
  • xxxhdpi(超-超-超-高)~640dpi

DIPDP 是密度不变的像素,即它们对应于或多或少的像素,具体取决于物理密度。

  • MDPI 上的 1dp = 1px

enter image description here

SPSIP与比例无关的像素。当打开“大文本”选项时,它们会缩放Settings > Accessibility

  • 1sp = 1dp
  • 1sp = 1.2dp,带辅助功能大文本

使用什么?

使用 sp 表示文本大小。

dp 用于其他所有内容。

54赞 Ravi Vaghela 3/4/2016 #21

中的屏幕大小分为 、 、 和 类别。屏幕密度是屏幕区域(如一英寸)内的像素数。通常,它以每英寸点数 (dpi) 为单位。屏幕密度分为低、中、高和超高。分辨率是屏幕上的像素总数。Androidsmallmediumlargeextra largedouble-extratriple-extra

  • DP值:密度无关像素,因屏幕密度而异。在 160 dpi 屏幕中,1 dp = 1 像素。除字体大小外,请始终使用 dp。
  • dip:dip == dp。在早期的 Android 版本中,使用了 dip,后来改为 dp。
  • sp:缩放独立像素,根据用户的字体大小偏好进行缩放。字体应使用 sp。
  • px:我们通常的标准像素,映射到屏幕像素。
  • in:英寸,与物理屏幕尺寸有关。
  • mm:毫米,与物理屏幕尺寸有关。
  • pt:1/72 英寸,与物理屏幕尺寸有关。

单位间换算公式

 px = dp * (dpi / 160)

设备中的 dp 到 px

以下示例可能有助于更好地理解。缩放基于 120(ldpi)、160(mdpi)、240(hdpi)、320(xhdpi)、480(xxhdpi) 和 640(xxxhdpi) 的存储桶大小进行。对于ldpi:mdpi:hdpi:xhdpi:xxhdpi,Google建议的设计比例为3:4:6:8:12

一张 150px X 150px 的图片将占据,

  • 150 dp X 150 dp 屏幕空间(以 mdpi 为单位)
  • 100 dp X 100 dp 屏幕空间(以 HDPI 表示)
  • 75 dp X 75 dp 屏幕空间(以 xhdpi 为单位)

当您希望在所有 Android 设备上拥有统一的 UI 设计时,您可以使用以下 DPI 计算器来修复图像大小和其他尺寸。

Java 中的 DPI 计算器

/*
Program output
LDPI: 165.0 X 60.0
MDPI: 220.0 X 80.0
HDPI: 330.0 X 120.0
XHDPI: 440.0 X 160.0
XXHDPI: 660.0 X 240.0
XXXHDPI: 880.0 X 320.0
*/


public class DPICalculator {

private final float LDPI = 120;
private final float MDPI = 160;
private final float HDPI = 240;
private final float XHDPI = 320;
private final float XXHDPI = 480;
private final float XXXHDPI = 640;    

private float forDeviceDensity;
private float width;
private float height;

public DPICalculator(float forDeviceDensity, float width, float height){
    this.forDeviceDensity = forDeviceDensity;
    this.width = width;
    this.height = height;
}

public static void main(String... args) {
    DPICalculator dpiCalculator = new DPICalculator(240,330,120);
    dpiCalculator.calculateDPI();
}


private float getPx(float dp, float value) {
    float px = dp * (value / forDeviceDensity );        
    return px;
}

private void calculateDPI() {

    float ldpiW = getPx(LDPI,width);        
    float ldpiH =  getPx(LDPI,height);
    float mdpiW = getPx(MDPI,width);        
    float mdpiH =  getPx(MDPI,height);        
    float hdpiW = getPx(HDPI,width);        
    float hdpiH =  getPx(HDPI,height);       
    float xdpiW = getPx(XHDPI,width);        
    float xdpiH =  getPx(XHDPI,height);
    float xxdpiW = getPx(XXHDPI,width);        
    float xxdpiH =  getPx(XXHDPI,height);
    float xxxdpiW = getPx(XXXHDPI,width);        
    float xxxdpiH =  getPx(XXXHDPI,height);
    
    System.out.println("LDPI: " + ldpiW + " X " + ldpiH);
    System.out.println("MDPI: " + mdpiW + " X " + mdpiH);
    System.out.println("HDPI: " + hdpiW + " X " + hdpiH);
    System.out.println("XHDPI: " + xdpiW + " X " + xdpiH);
    System.out.println("XXHDPI: " + xxdpiW + " X " + xxdpiH);
    System.out.println("XXXHDPI: " + xxxdpiW + " X " + xxxdpiH);        
   }
}

有关详细信息,请参阅以下链接。

http://javapapers.com/android/difference-between-dp-dip-sp-px-in-mm-pt-in-android/

16赞 ProtossShuttle 4/2/2016 #22

我想提供一种简单的理解方式。事实上,我认为这是最容易理解的。 只是一个物理长度单位。它与 或 具有相同的维度。它只是方便我们写 ,而不是 或 ,因为无论屏幕尺寸或分辨率如何,一个都是。dpdpdpmminch50dp60dp50/160 inch60/160 inchdp1/160 inch

唯一的问题是,某些屏幕的android dpi不准确。例如,分类为 160dpi 的屏幕可能确实具有 170dpi。所以的计算结果是模糊的。它应该与 大致相同。dp1/160 inch

43赞 Mixaz 5/18/2016 #23

我遇到了一篇关于为不同的屏幕分辨率设计 Android 应用程序 UI 的好文章,我想把它留在这里,只供在这个领域搜索的人使用。是的,我知道它在谷歌文档中以某种方式被描述过(并在上面的帖子中提到过),我读过它,但它对我不好(是的,我可能太愚蠢了))。我仍然不清楚如何设计能够处理不同屏幕尺寸的布局。当我需要为不同的屏幕实现“灵活”的 UI 布局时,我讨厌 DP 概念等等。(嘿 iOS 开发人员 - 是的,你是对的,这是一个故事板概念)。

不幸的是,Android 的 UI 概念还不错,但缺少 iOS 故事板功能。在 Android 中设计灵活的 UI 并不是一件容易的事情(充其量)。

这篇文章帮助我了解如何在 Android 中为不同的屏幕尺寸制作布局:

JMSTUDIO 博客:- 确定 Android 应用程序屏幕尺寸

如何为不同屏幕尺寸的 Android 应用程序设计 UI

要为不同的屏幕尺寸设计应用程序 UI,我们的初始设计必须 满足每种屏幕尺寸所需的最小空间。Android 定义了一个 每种通用屏幕类型的最小尺寸(以 dp 为单位)。这是一个 Android 屏幕尺寸指南。Minimum Screen Size for Android in dp当我们以dp为单位获得屏幕尺寸时,我们设计是不够的 Android 应用界面。对于每种屏幕尺寸,我们需要准备图形 以及每种密度的位图图像。这是Android屏幕密度 指引。Android Density Guideline (dpi)

为了便于计算,我们可以遵循 3:4:6:8 之间的缩放比例 四种广义密度。如果我们创建一个 36×36 像素的图片 LDPI 设备,其余密度图片大小为 MDPI 的 48×48, HDPI 为 72×72,xhdpi 为 96×96。

如何在 Photoshop 中设计 Android 应用程序 UI

许多设计人员在 Photoshop 或其他像素中设计 Android 应用程序 UI 时遇到问题 基于图形设计工具,因为与密度无关的单位 DP。 设计人员不知道如何将 dp 映射到像素。谷歌也不给 为他们提供清晰的 Android UI 设计指南,尽管他们提供了基本的 DP 和像素平移的公式。

根据 Android 的定义,在 160 dpi 设备 (mdpi) 下,1pd 等于 1px。 因此,我们想为 xlarge Android 设备设计一个 Android 应用程序 mdpi 密度,我们可以将 UI 大小(以像素为单位)定义为宽度为 960 像素 高度为720px;遵循相同的映射规则,我们可以得到 遵循 Android 应用屏幕大小 UI 设计指南:

Android App Screen Size in Pixel Guideline

新增:如果你也对“灵活”的UI感兴趣,可以看看这个库:一个提供新大小单位的Android SDK - sdp(可扩展dp)。这个尺寸单位与屏幕尺寸成比例(这在这里的答案中也提到过,关于库)SDP

添加2Google 终于明白了 iOS Storeboard UI 概念的用处,Android 世界就这样来了: 使用 ConstraintLayout 构建响应式 UIConstraintLayout

56赞 shijin 5/26/2016 #24

请阅读社区维基上的答案。 除了上述答案之外,下面提到的是一些需要考虑的信息。大多数 Android 开发人员在开发应用程序时都忽略了这一点,因此我添加了这些要点。

sp = 与比例无关的像素

dp = 与密度无关的像素

dpi = 密度像素

我已经浏览了上面的答案......没有发现它们完全正确。 sp 表示文本大小,dp 表示布局边界 - 标准。 但是,如果在大多数设备中不小心使用文本大小的 sp 会破坏布局

sp 取设备的文本大小,而 dp 取设备密度标准的文本大小(在设备中永不更改) 假设 100sp 文本可以占据屏幕的 80% 或 100%,具体取决于设备中设置的字体大小

enter image description here

您也可以将 sp 用于布局边界,它将:)没有标准应用程序将 sp 用于全文

使用 sp 和 dp 作为考虑 UX 的文本大小。

  • 不要在工具栏中使用 sp 作为文本(可以使用 dp 的不同屏幕尺寸的 android dimens)
  • 不要将 sp 用于小有界按钮、非常小的文本等中的文本

有些人在手机中使用巨大的字体大小以提高可读性,给他们小的硬编码大小的文本将是一个用户体验问题。在必要时将 sp 放在文本中,但请确保它不会在用户更改其设置时破坏布局。

同样,如果您有一个支持所有维度的应用,则添加 xxxhdpi 资产会大大增加应用大小。但现在 xxxhdpi 手机很常见,因此我们必须至少在侧边栏、工具栏和底部栏中的图标中包含 xxxhdpi 资产。最好转向矢量图像,以便为所有屏幕尺寸提供均匀且质量更好的图像。

另外,请注意,人们在手机上使用自定义字体。因此,缺少字体会导致间距等问题。假设自定义字体的文本大小为 12sp 可能会比默认字体多一些像素。

请参阅 google 开发者网站,了解 android 的屏幕密度和基本密度详细信息。https://developer.android.com/training/multiscreen/screendensities

20赞 A.Saini 7/2/2016 #25

SP:与比例无关的像素

您应该将它与文本一起使用,因为它会根据用户在其设备中使用的字体大小自动缩放。

px:像素或图片元素是屏幕上的单个点

13赞 Qamar 12/27/2016 #26

SDP - 一个可扩展的大小单位 - 基本上它不是一个单位,而是不同屏幕尺寸的尺寸资源。

试试 Intuit 的 sdp 库。解决单元问题非常方便,可以快速支持多屏

用法

android:paddingBottom="@dimen/_15sdp"对于正 SDP 和负 SDP SDPandroid:layout_marginTop="@dimen/_minus10sdp"

对于文件夹中的每个大小,它具有等效的 dp 值 (sw = smallestWidth)。values-sw<N>dp

注意力

请谨慎使用!在大多数情况下,您仍然需要为平板电脑设计不同的布局。

<LinearLayout
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginTop="@dimen/_minus10sdp"
          android:paddingBottom="@dimen/_15sdp"
          android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:includeFontPadding="false"
                    android:text="♡"
                    android:textColor="#ED6C27"
                    android:textSize="@dimen/_70sdp"
                    android:textStyle="bold" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:includeFontPadding="false"
                    android:text="U"
                    android:textColor="@android:color/black"
                    android:textSize="@dimen/_70sdp" />
            </LinearLayout>

您可以使用 db 作为文本大小,但我更喜欢 ssp 作为文本大小。

有关更多详细信息,请查看库 GitHub 页面

24赞 Android Developer 1/29/2017 #27

手机的屏幕由数千个称为像素 (px) 的小点组成。像素是构成图片的最小元素。制作图片或文字的像素数越多,它就越清晰,使智能手机屏幕更容易阅读。

屏幕分辨率是根据屏幕上的像素数来衡量的。屏幕分辨率是购买设备时常用的规格,但在为 Android 设计时实际上并没有那么有用,因为从像素的角度考虑屏幕忽略了物理尺寸的概念,这对于触摸设备来说非常重要。

与密度无关的像素(dp 或 dip)允许设计人员创建以预期方式显示的资产,无论目标设备的分辨率或密度如何。

与密度无关的像素(dp 或 dip)等于基线密度或 160 dpi(每英寸点数)下的 1 个像素。

1 像素/1dp = 160 dpi/160 dpi

2 像素/1dp = 320 dpi(2x)/160 dpi

哪里

DPI 是每英寸点数

因此,在 320 dpi 时,1 dp 等于 2 px。

公式

px/dp = dpi/160dpi

每英寸点数 (dpi) 是显示屏上清晰度(即发光点的密度)的量度。给定图片分辨率的每英寸点数将根据整体屏幕尺寸而有所不同,因为相同数量的像素分布在不同的空间中。

使用与密度无关的像素有助于我们处理以下情况:您有两台具有相同像素分辨率但空间大小不同的设备。假设在某个案例中,平板电脑和手机具有相同的像素分辨率,分别为 1280 x 800 像素 (160 dpi) 和 800 x 1280 像素 (320 dpi)。

现在,由于平板电脑处于基线密度 (160 dpi),因此其物理和密度无关的像素大小相同,即 1280 x 800。另一方面,手机具有更高的像素密度,因此它的密度无关像素数量是物理像素的一半。因此,手机具有 400 x 640 密度与像素无关的像素。因此,使用与密度无关的像素可以更容易地在脑海中想象平板电脑比手机拥有更多的空间。

同样,如果您有两台屏幕尺寸相似但像素密度不同的设备,假设一台是 800 x 1280 像素 (320 dpi),另一台是 400 x 640 像素 (160 dpi),我们不需要为这两款设备定义完全不同的布局,因为我们可以根据密度无关像素来衡量资产,这对两个设备来说都是相同的。

800 x 1280 像素 (320dpi)=400 x 640 密度无关像素 (dp)

400 x 640 像素 (160 dpi)=400 x 640 密度无关像素 (dp)

与比例无关的像素 (sp) 是字体大小的首选单位。 出于辅助功能目的,Android 允许用户自定义其设备的字体大小。阅读文本有困难的用户可以增加设备的字体大小。您通常可以在手机或平板电脑的显示设置中的字体大小下找到此选项。它通常也可以通过辅助功能设置获得。

对于与比例无关的像素,当设备的字体大小为正常或 100% 时,16 sp 与 16 dp 完全相同。但是,当设备的字体大小较大时,例如 125%,16 sp 将转换为 20 dp 或 1.25 乘以 16。

如果使用 dp 作为字体大小的单位,则无论用户是否自定义了设备的字体大小,该文本段都具有特定的物理大小。使用 sp 装置将为视力受损的人提供更好的体验。

参考资料Udacity、Google

8赞 Narendra Sorathiya 3/4/2017 #28

dp 与像素的比率会随着屏幕密度的变化而变化,但不一定是成正比的。

注意:编译器同时接受“dip”和“dp”,尽管“dp”与“sp”更一致。

与比例无关的像素 - 这与 dp 单位类似,但它也会根据用户的字体大小偏好进行缩放。

18赞 lalit vasan 5/10/2017 #29

像素 (px) – 对应于屏幕上的实际像素。如果要以绝对像素表示宽度或高度,则可以使用此方法。

与密度无关的像素(dp 或 dip) – 基于屏幕物理密度的抽象单元。这些单位是相对于 160 dpi 屏幕的,因此 1 dp 是 160 dpi 屏幕上的一个像素。dp 与像素的比率会随着屏幕密度的变化而变化,但不一定是成正比的。注意:编译器同时接受“dip”和“dp”,尽管“dp”与“sp”更一致。

与比例无关的像素 (sp) – 这与 dp 单位类似,但它也根据用户的字体大小偏好进行缩放。建议您在指定字体大小时使用此单位,以便根据屏幕密度和用户偏好进行调整。

始终仅使用 dp 和 sp。sp 表示字体大小,dp 表示其他所有内容。它将使 UI 与不同密度的 Android 设备兼容。 您可以从以下位置了解有关像素和 dp 的更多信息 https://www.google.com/design/spec/layout/units-measurements.html#units-measurements-density-independent-pixels-dp-

源 URL:- http://www.androidtutorialshub.com/what-is-the-difference-between-px-dp-dip-sp-on-android/

25赞 lava-lava 8/31/2018 #30

像素密度

屏幕像素密度和分辨率因平台而异。与设备无关的像素和可缩放的像素是提供跨平台适应设计的灵活方式的单元。

计算像素密度

适合一英寸的像素数称为像素密度。高密度屏幕的每英寸像素数比低密度屏幕多......

适合一英寸的像素数称为像素密度。高密度屏幕的每英寸像素数比低密度屏幕多。因此,相同像素尺寸的 UI 元素在低密度屏幕上显示得更大,而在高密度屏幕上显示得更小。

要计算屏幕密度,可以使用以下公式:

屏幕密度 = 屏幕宽度(或高度)(以像素为单位)/屏幕宽度(或高度)(以英寸为单位)

Hight density vs lower density displays

密度无关

屏幕像素密度和分辨率因平台而异。与设备无关的像素和可缩放的像素是提供跨平台适应设计的灵活方式的单元。

计算像素密度 适合一英寸的像素数称为像素密度。高密度屏幕的每英寸像素数比低密度屏幕多......

密度独立性是指 UI 元素在不同密度的屏幕上的均匀显示。

与密度无关的像素,写成 dp(发音为“dips”),是灵活的单位,可缩放以在任何屏幕上具有统一的尺寸。Material UI 使用与密度无关的像素在不同密度的屏幕上一致地显示元素。

  1. 低密度屏幕显示,不受密度影响
  2. 高密度屏幕显示,不受密度影响

https://material.io/design/layout/pixel-density.html 阅读全文

-1赞 Bilal 6/2/2021 #31

px = 表示屏幕上用于像素计算的像素 px = dp * (DPI / 160) 可以使用 dip = 与密度无关的像素,等于 dp sp = 应该只用于文本

3赞 yoAlex5 9/30/2022 #32

安卓 px、dp、sp

  • pixelsPX(绝对绝对值)
  • Density-independent PixelsDP,DIP - 允许您不依赖于像素,并在每英寸具有不同像素的屏幕上获得相同的结果
  • Scale-independent pixelssp、sip - 与 dp 相同,但用于字体

[iOS 像素 vs 点数 vs 单位]

1赞 Bhavnish 10/21/2023 #33

嗨,这里是术语的解释:

px(像素):将像素想象成屏幕上的小点。无论如何,它们都保持相同的大小。不是在 Android 中调整大小的最佳选择,因为它不适应不同的屏幕。

dp(密度无关像素):可以将其视为智能像素。它可以改变尺寸以在任何屏幕上看起来都不错,无论是大型平板电脑还是小型手机。

sp(与比例无关的像素):这个就像 dp,但也考虑到有人喜欢大文本还是小文本。因此,它非常适合制作每个人都易于阅读的文本。