题 “px”,“dip”,“dp”和“sp”之间有什么区别?


android测量单位有什么区别?

  • PX
  • DP
  • SP

5159
2018-01-08 03:23


起源


这是在android中使用px,dip,dp和sp之间的完全差异[ developer.android.com/guide/topics/resources/... - NagarjunaReddy
这个漂亮的转换器证明了它最好, 我的想法是。它对于从Photoshop导出精灵或为物理尺寸设计布局也非常有用。 - Paul Lammertsma
有关Google Design的新说明 单位和测量 - Arnav M.
DP,SP和像素之间的差异与示例。 - Ajit Singh
如何以编程方式之间进行转换 px, dp,和 sp - Suragch


答案:


来自 Android开发人员文档

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


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

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

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

  5. DP 要么
    密度独立像素 - 基于屏幕物理密度的抽象单位。这些单位相对于160       dpi屏幕,所以一个dp是160 dpi屏幕上的一个像素。比例       dp-to-pixel将随屏幕密度而变化,但不一定如此       按比例分配。注意:编译器同时接受“dip”和       “dp”,尽管“dp”与“sp”更为一致。

  6. SP
    规模独立像素 - 这就像dp单位,但也可以通过用户的字体大小首选项进行缩放。建议你       指定字体大小时使用此单位,因此将对其进行调整       屏幕密度和用户偏好。

了解Android中的密度独立性

+----------------+----------------+---------------+-------------------------------+
| Density Bucket | Screen Density | 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 | 
+----------------+----------------+---------------+-------------------------------+
+---------+-------------+---------------+-------------+--------------------+
| Unit    | Description | Units Per     | Density     | Same Physical Size | 
|         |             | Physical Inch | Independent | On Every Screen    | 
+---------+-------------+---------------+-------------+--------------------+
| px      | Pixels      | Varies        | No          | No                 | 
+---------+-------------+---------------+-------------+--------------------+
| in      | Inches      | 1             | Yes         | Yes                | 
+---------+-------------+---------------+-------------+--------------------+
| mm      | Millimeters | 25.4          | Yes         | Yes                | 
+---------+-------------+---------------+-------------+--------------------+
| pt      | Points      | 72            | Yes         | Yes                | 
+---------+-------------+---------------+-------------+--------------------+
| dp      | Density     | ~160          | Yes         | No                 | 
|         | Independent |               |             |                    | 
|         | Pixels      |               |             |                    | 
+---------+-------------+---------------+-------------+--------------------+
| sp      | Scale       | ~160          | Yes         | No                 | 
|         | Independent |               |             |                    | 
|         | Pixels      |               |             |                    | 
+---------+-------------+---------------+-------------+--------------------+

更多信息也可以在 Google设计文档

在真实设备上计算尺寸 这个 应用程序可以使用。


5196
2018-02-25 12:56



即使它们应该是同一个东西,我倾向于有很多dp的问题,而一切都很好用dip - DallaRosa
关于db / sp的一个注意事项并不是完全明显的:为这些设备进行的缩放不取决于设备的实际密度(dpi),而是取决于它所属的“桶”密度:可用桶是:120,160,240,320。这可能会导致处理屏幕的一些问题,这些屏幕明显不同,但会相同。 - Fraggle
请注意,文档不再提及“dip”,只是“dp”,尽管编译器似乎仍然接受“dip”。 - Adam Rosenfield
@android_developer(上面的5条评论) dp 不 不 具有完全相同的物理长度。 (虽然它很接近。)请参阅@ Fraggle关于bucketing的评论。这意味着48dp大约为8毫米(0.3英寸),但它可能会变化到11毫米。 - intrepidis
分拆的原因是开发人员可以在几个不同密度的设备上测试他们的应用程序,并确信布局在多种设备上看起来都一样。因此,即使按钮等的物理尺寸稍有变化,活动的整体外观也会相同。 - intrepidis


几乎所有关于此以及如何获得对具有不同尺寸和密度的多个屏幕的最佳支持在这里都有很好的记录:

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

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

方向
从用户的角度来看屏幕的方向   视图。这是横向或纵向,意味着屏幕的   长宽比分别为宽或高。请注意不要   只有不同的设备才能在不同的方向上运行   默认情况下,但方向可以在用户运行时更改   旋转设备。

解析度
 物理像素总数   一个屏幕。在添加对多个屏幕的支持时,应用程序可以   不能直接解决问题;应该关注申请   只有屏幕尺寸和密度,由广义指定   大小和密度组。

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

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


606
2017-08-02 14:15



因此,如果您使用dp作为按钮而sp使用按钮文本的字体大小,那么当用户开始缩放时会发生什么?文字会放大,但按钮是否会通过放大来容纳这个? - Wytze
@Wytze,不。对于适合文本可能是一个问题的事情,我只会使用dip,所以事情不会溢出。 - eski
@Wytze和我相反,使用sp作为文本及其包含的内容。例如,如果我有一个固定大小的按钮并且里面有文本,我会在sp中分配按钮大小,以便在需要时进行扩展。否则,用户会因为增加文本的大小而烦恼,并且没有增加。当然,布局应该足够灵活以允许它。 - Malcolm
@Sam嗯,由你决定什么更重要:你的设计或有视力问题的用户阅读你的文字的能力。 - Malcolm
如果您的设计人员不会为基于文本的元素留出空间来根据sp大小进行缩放,则可以选择切换到您用于较窄设备的任何布局,然后通过(DisplayMetrics.scaledDensity / DisplayMetrics)统一扩展所有内容。密度)。 - John Mellor


我将详细说明dp如何转换为px:

  • 如果在mdpi设备上运行,a 150 x 150 px 图像将占用 150 * 150 dp 屏幕空间。
  • 如果在hdpi设备上运行,a 150 x 150 px 图像将占用 100 * 100 dp 屏幕空间。
  • 如果在xhdpi设备上运行,a 150x150 px 图像将占用 75 * 75 dp 屏幕空间。

反过来说:你想要在你的应用程序中添加一个图像,你需要它来填充一个 100 * 100 dp 控制。您需要为支持的屏幕尺寸创建不同尺寸的图像:

  • 100 * 100 px mdpi的图像
  • 150 * 150 px hdpi的图像
  • 200 * 200 px 图像为xhdpi

280
2017-10-30 09:43



我们如何计算hdpi,ldpi,mdpi等的像素。我听说我们使用这个公式..px = dp *(dpi / 160);你能用这个公式解释我吗? - Rakesh patanga
@Rakeshpatanga密度为160 dpi,1 px = 1 dp(物理像素和dp抽象相同)。也就是说,对于单个dp,我们有(1)*(160/160)= 1,或恰好1 px。在320dpi的较高密度下,单个dp是(1)*(320/160)= 2个像素,并且两个dp是(2)*(320/160)= 4px。 - samsara
将它们放在等宽视图中以查看:| 1dp |,| ___ | ___ | 160,| _ | _ | _ | _ | 320(在逗号后面加上换行符)。 | _ | = 1 p一世X埃尔。 - samsara
重新“你需要为支持的屏幕尺寸创建不同尺寸的图像:”这取决于。对于 小高对比度 图像,例如图标,明智的做法是创建至少最小的尺寸(以确保它将是清晰的)加上相当大的尺寸(以便大版本看起来不模糊)。但即使对于图标,您也可以允许一个图像在一系列尺寸上以更高的密度进行缩放。对于照片,只需指定要填充的显示区域,并依赖设备缩放。 - ToolmakerSteve


PX 像素  - 每个刻度点对应于屏幕上的实际像素。

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

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

PT 点  - 基于屏幕物理尺寸的1/72英寸。

DP 密度  - 独立像素 - 基于屏幕物理密度的抽象单元。 这些单位相对于160 dpi的屏幕,所以一个 dp 是160 dpi屏幕上的一个像素。 dp与像素的比率将随屏幕密度而变化,  但不一定是正比例。  注意:编译器同时接受这两个 dip 和 dp但是 dp 更符合 sp

SP - 与尺度无关的像素  - 这就像 dp 单元,  但它也会根据用户的字体大小首选项进行缩放。 建议您在指定字体大小时使用此单位,  因此,他们将根据屏幕密度和用户的偏好进行调整。

以两个尺寸相同但屏幕密度为160 dpi(每英寸点数,即每英寸像素数)的屏幕为例,另一个屏幕为240 dpi。

                          Lower resolution   screen          Higher resolution, same size
Physical Width                      1.5 inches                        1.5 inches
Dots Per Inch (“dpi”)               160                               240
Pixels (=width*dpi)                 240                               360
Density (factor of baseline 160)    1.0                               1.5

Density-independent Pixels          240                               240
(“dip” or “dp” or “dps”)

Scale-independent pixels 
 (“sip” or “sp”)                  Depends on user font size settings    same

232
2017-07-26 21:19





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

屏幕尺寸:

实际物理尺寸,以屏幕对角线测量。为简单起见,Android将所有实际屏幕尺寸分组   四种广义尺寸:小型,普通型,大型和超大型。

屏幕密度: 

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

方向: 

从用户的角度看屏幕的方向。这是风景或肖像,意思是   屏幕的宽高比分别为宽或高。意识到   这不仅使不同的设备在不同的方向上运行   默认情况下,但在用户运行时,方向可以更改   旋转设备。

解析度:

屏幕上的物理像素总数。添加对多个屏幕的支持时,应用程序无法直接运行   决议;应用程序应仅关注屏幕   尺寸和密度,由广义尺寸和密度规定   组。

密度无关像素(dp): 

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

参考: Android开发者网站


183
2017-10-17 12:47





dp 是 dip。用于所有事情(边距,填充等)。

使用 sp 仅适用于{text-size}。


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


看看之间的区别 pxdp 和 sp 在不同的屏幕尺寸上。

Enter image description here

资源: Android编程:大书呆子牧场指南


168
2018-01-10 19:13



但我不能将dp值传递给setX或setY函数,android不会在这里翻译它。我能做什么? - Daniel Viaño


我已经计算了下面的公式来进行转换 dpi 至 dp 和 sp enter image description here


118
2017-12-27 09:21



它应该是ppi而不是dpi - Prateek


定义

PX 或点是一个 像素 在物理屏幕上。

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

Android给出了 别名到几个密度

  • ldpi(低)~120dpi
  • mdpi(中)~160dpi
  • hdpi(高)~240dpi
    • 2015年的大多数设备都在这里
  • xhdpi(超高)~320dpi
    • Apple iPhone 4/5/6,Nexus 4
  • xxhdpi(extra-extra-high)~480dpi
    • Nexus 5
  • xxxhdpi(额外超高)~640dpi

 要么 DP 是 密度不相关的像素,即它们根据物理密度对应于更多或更少的像素。

  • mdpi上1dp = 1px

enter image description here

SP 要么  是一个 与尺度无关的像素。它们在缩放时缩放 大文字 选项已打开 设置 > 无障碍

  • 1sp = 1dp
  • 1sp = 1.2dp,可访问性大文本

用什么?

使用 SP 对于文字大小。

使用 DP 其他一切。


107
2017-09-20 21:34





来源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

像素 - 对应屏幕上的实际像素。这个单位   不推荐使用度量,因为实际表示可能会有所不同   跨设备;每个设备可能具有不同的像素数   英寸可能在屏幕上有更多或更少的总像素。

毫米

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

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

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


104
2018-04-02 06:35



另外:这个答案的附加值是多少?似乎没有其他答案中没有提到过的东西。 - laalto


基本上px应用的唯一时间是一个px,如果你想在屏幕上只有一个像素,就像分频器一样:

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

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


96
2017-07-09 05:46



getDimensionPixelOffset向下舍入,getDimensionPixelSize向上舍入。 - Eugen Pechanec


PX

像素 - 对应于屏幕上的实际像素。

dp或dip

密度无关像素 - 基于屏幕物理密度的抽象单元。这些单位相对于160 dpi的屏幕,因此一个dp是160 dpi屏幕上的一个像素。

使用dp:

密度独立性  - 当您的应用程序在不同密度的屏幕上显示时,保留用户界面元素的物理大小(从用户的角度来看),可实现“密度独立性”。 (即)图像在不同类型的屏幕中看起来应该相同(不放大或缩小)。

SP

与比例无关的像素 - 这与dp单位类似,但它也可以通过用户的字体大小首选项进行缩放。

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


81
2018-02-13 18:50



我看到这是对一个大问题的迟到答案。请问这个答案提供的其他答案都没有? - Mysticial
@Mysticial它给回答者790分(截至此评论)! - Scott Biggs