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


5812

Android度量单位有什么区别?

  • 像素
  • dp
  • SP

65
这是用PX,浸,DP和SP之间的完全差异android的[ developer.android.com/guide/topics/resources/...
NagarjunaReddy

20
我认为,这个漂亮的转换器可以最好地展示它。这对于从Photoshop导出精灵或为物理尺寸设计布局也非常有用。
Paul Lammertsma

9
Google设计单位和尺寸的
Arnav M.


Answers:


5770

来自Android开发者文档

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


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

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

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

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

  6. sp
    Scale -independent Pixels-类似于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设计文档中找到


17
即使它们应该是同一件事,我在使用dp时也会遇到很多问题,而在使用dip时一切都可以正常工作
DallaRosa 2011年

247
关于db / sp的一个注解并不完全清楚:发生这些缩放的比例并不取决于设备的实际密度(dpi),而是取决于它属于哪个密度的“存储桶”:可用存储桶为:120,160,240,320。这可能会导致一些处理屏幕的问题,这些屏幕明显不同,但存储桶相同。
Fraggle等

15
请注意,尽管编译器似乎仍然接受“ dip”,但文档不再提到“ dip”,而只是提及“ dp”。
亚当·罗森菲尔德

15
@android_developer(5个评论以上)dp不会具有完全相同的物理长度。(尽管它很接近。)请参阅@Fraggle关于存储的评论。这意味着48dp大约为8毫米(0.3英寸),但最大可能变化到11毫米。
intrepidis 2013年

11
进行存储分区的原因是,开发人员可以在几台不同密度的设备上测试其应用程序,并确信布局在多种设备上看起来都一样。因此,即使按钮等的物理尺寸有所变化,活动的整体外观也将相同。
intrepidis

684

关于此的几乎所有内容,以及如何为不同尺寸和密度的多个屏幕提供最佳支持,在此处都有很好的记录:

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

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

方向
从用户的角度看屏幕的方向。这可以是横向或纵向,这意味着屏幕的宽高比分别为宽或高。请注意,默认情况下,不同的设备不仅会以不同的方向运行,而且在用户旋转设备时,其方向可能会在运行时发生变化。

分辨率
屏幕上的物理像素总数。添加对多屏幕的支持时,应用程序无法直接使用分辨率工作;应用程序应仅关注屏幕尺寸和密度,这由广义尺寸和密度组指定。

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

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


41
因此,如果将dp用于按钮,将sp用作按钮文本的字体大小,那么当用户开始缩放时会发生什么?文本会放大,但是按钮也会通过放大来容纳它吗?
Wytze

11
@Wytze,不。对于适合文本的问题,我只用蘸蘸即可,以免溢出。
eski

12
@Wytze相反,我对文本及其包含的内容都使用sp。例如,如果我有一个固定大小的按钮,并且其中包含一个文本,则可以在sp中分配按钮大小,以便在需要时也可以按比例放大。否则,用户会因为他增加了文本的大小而感到烦恼,但没有增加。当然,布局应足够灵活以允许它。
马尔科姆

2
如果您的设计人员不会为基于文本的元素留出空间来根据sp大小进行缩放,则一种选择是切换到用于较窄设备的任何布局,然后按(DisplayMetrics.scaledDensity / DisplayMetrics统一缩放所有内容。密度)。
约翰·梅勒

@Sam缺少任何可用空间也会在i18n期间引起问题
减少活动

346

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

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

另一种方法是:说,您想向应用程序中添加图像,并且需要它来填充100 * 100 dp控件。您需要为支持的屏幕尺寸创建不同尺寸的图像:

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

2
我们如何计算hdpi,ldpi,mdpi等的像素。听说我们使用此公式。你能用这个公式解释我吗?
Rakesh patanga'3

@Rakeshpatanga在密度为160 dpi时,1 px = 1 dp(物理像素和dp抽象相同)。也就是说,对于单个dp,我们有(1)*(160/160)= 1或正好1 px。在320 dpi的较高密度下,单个dp为(1)*(320/160)= 2像素,两个dp为(2)*(320/160)= 4 px。
samis

将它们排列在等宽处以查看:| 1dp |,| ___ | ___ | 160,| _ | _ | _ | _ | 320(逗号后换行)。| _ | = 1 p i x el。
samis

关于“您需要为支持的屏幕尺寸创建不同尺寸的图像:”这取决于。对于较小的高对比度图像(例如图标),明智的做法是至少创建最小尺寸(以确保清晰),再添加相当大的尺寸(以使大字体看起来不会模糊)。但是,即使是图标,也可以允许一张图像以更高的密度在一定范围内缩放。对于照片,只需指定要填充的显示区域,然后依靠设备缩放即可。
制造商史蒂夫(Steve)'18年

285

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

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

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

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

dp-密度无关像素 -基于屏幕物理密度的抽象单位。这些单位是相对于160 dpi屏幕的,因此一个dp是160 dpi屏幕上的一个像素。dp与像素的比率将随屏幕密度而变化,但不一定成正比。注意:编译器接受dipdp,尽管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

233

此外,您应该对以下概念有清楚的了解:

屏幕尺寸:

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

屏幕密度:

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

取向:

从用户的角度看屏幕的方向。这可以是横向或纵向,这意味着屏幕的宽高比分别为宽或高。请注意,默认情况下,不同的设备不仅会以不同的方向运行,而且在用户旋转设备时,其方向可能会在运行时发生变化。

解析度:

屏幕上的物理像素总数。添加对多屏幕的支持时,应用程序无法直接使用分辨率工作;应用程序应仅关注屏幕尺寸和密度,这由广义尺寸和密度组指定。

密度无关像素(dp):

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

参考:Android开发人员网站


这是否意味着无论设备的像素密度如何,使用dp单元设计的任何东西都将始终占据相同的屏幕百分比?假设长宽比相同。
DBIT


143

我已经计算出以下公式,可以将转换dpidpsp 在此处输入图片说明


10
它应该是ppi而不是dpi
Prateek

141

定义

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

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

Android为几种密度提供别名

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

dipdp是非密度像素,即取决于物理密度,它们对应于更多或更少的像素。

  • 1dpi = 1像素(在mdpi上)

在此处输入图片说明

spsip是与比例无关的像素。在>中打开“ 大字体”选项时,它们会缩放SettingsAccessibility

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

使用什么?

使用sp作为文本大小。

dp用于其他所有内容。


128

来源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英寸。

像素

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

毫米

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

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

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


9
另外:此答案的附加值是什么?似乎没有其他答案中未提及的任何内容。
laalto

118

基本上,适用px的唯一时间是一个px,也就是说,如果您想要在屏幕上恰好一个像素,例如使用分隔线的情况:

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

在> 120 dpi时,其舍入为0。


getDimensionPixelOffset向下舍入,getDimensionPixelSize向上舍入。
Eugen Pechanec '17

101

像素

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

dp或dip

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

使用dp:

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

SP

与比例无关的像素-就像dp单位一样,但是它也通过用户的字体大小首选项进行缩放。

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


97

哪里使用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。


89

你可以看到之间的差异px,并dp从下面的图片,你也可以发现pxdp不能保证在不同的屏幕相同的物理尺寸。

在此处输入图片说明


3
@EnesBattal,我认为因为dp并不是一个物理尺寸,所以它是一个近似值。CapTech引述的话:“ dp-这是一个与密度无关的单位,但是单个” dp”的物理尺寸在每个屏幕密度上仅大致相同。一英寸大约为160” dp”。缩放比例取决于设备密度桶上的“像素”用于将“ dp”转换为160 dpi时的像素数。单个“ dp”转换的像素数取决于屏幕上的像素和设备掉落的密度桶进入。”
Zephyr

3
@RuchirBaronia,我认为DP或DIP仍在apk内,因为apk尚不知道它将以哪种屏幕密度运行,因此仍应保持设备独立性。
Zephyr

79

与文字大小和外观有关的任何内容都必须使用sppt。而与控件大小,布局等有关的任何内容都必须与一起使用dp

您可以同时使用dpdip在其位置使用。


69

我只会用dp。

关于使用“ sp”表示字体大小的讨论很多,尽管我很欣赏这一点,但从设计的角度来看,我认为这样做是不正确的。如果用户选择了一些不稳定的字体大小,最终可能会破坏您的设计,而最终用户将责备该应用程序,而不是自己的生活选择。

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

尽管“ sp”字体的想法很不错,但这是一个糟糕的想法。坚持使用dp进行所有操作。


1
您知道应用的字体比例因子sp是一个因子,对吗?任何有影响的事物dp也会影响sp。话虽如此,仍然优选使用来指定字体大小,dp而不是sp如果布局非常紧凑并且大字体不适合-最好使文本小于用户希望完全弄乱的布局。但是首先,您应该始终努力尊重用户的字体大小首选项-即使最大的设置也不是那么大。
卡鲁(Karu)

67

sp =比例无关像素

dp =倾斜=密度无关像素

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();

很好的理解教程是:http://vinsol.com/blog/2014/11/20/tips-for-designers-from-a-developer
Kushal 2015年

5
“我们应该避免使用sp”为什么会这样?在处理字体大小时,应使用sp,因为它考虑了用户的首选文本大小,developer.android.com
training/multiscreen/screendensities.html

我已经回答了有关布局角度的问题。
库沙尔(Kushal)2015年

问题是“ Android中px,dp,dip和sp之间的区别?” 您的回答是“我们应该避免使用sp”。在任何地方都没有提到“布局透视图”。
2015年

是的.. dp和dip相同...可互换使用...我的答案解决了您的查询吗?
库沙尔,2015年

61

之间的区别dp,并sp为“提到的单位用户的字体大小偏爱 ”从官方文档复制的答案都可以在运行时通过改变可以看到Settings->Accessibility->Large Text选项。

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

private static final float LARGE_FONT_SCALE = 1.3f;

当然,这可能取决于供应商,因为它位于package / apps / Settings中


52

dpi-

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

px-像素

  • 用于映射屏幕像素

pt-点

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

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

毫米-相对于物理屏幕尺寸。

sp-与比例无关的像素。

  • 根据用户的字体大小首选项。
  • 字体应为“ sp”。

浸-

  • 蘸== 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  

根据文档编译器接受“ dip”和“ dp”,尽管“ dp”与“ sp”更一致
Arunendra 2015年

46

这是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)

45

屏幕尺寸Android被分为不同的类别smallmediumlargeextra largedouble-extratriple-extra。屏幕密度是屏幕区域(如英寸)内的像素数量。通常,它以每英寸点数(dpi)为单位进行测量。屏幕密度分为低,中,高和超高。分辨率是屏幕中的像素总数。

  • dp:密度独立像素,它根据屏幕密度而变化。在160 dpi屏幕中,1 dp = 1像素。除字体大小外,请始终使用dp。
  • 倾角:倾角== 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)的存储桶大小进行缩放。Google建议的ldpi:mdpi:hdpi:xhdpi:xxhdpi设计比率为3:4:6:8:12

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

  • 150 dp X 150 dp屏幕空间(mdpi)
  • 100 dx 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/


45

请阅读社区维基的答案。除了上述答案外,下面提到的还有一些要考虑的信息。大多数Android开发人员在开发应用程序时都会错过这一点,因此我补充了这些观点。

sp =比例无关像素

dp =密度无关像素

dpi =密度像素

我已经通过以上答案...找不到完全正确的答案。sp表示文本大小,dp表示布局范围-标准。但是,如果在大多数设备中使用不当则sp的文本大小会破坏布局

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

在此处输入图片说明

您也可以将sp用作布局范围,它将起作用:) 没有标准应用程序将sp用作整个文本

考虑到UX,请将sp和dp用于文本大小。

  • 不要在工具栏中的文本中使用sp(可以使用dp来为不同屏幕尺寸使用android变暗)
  • 不要在有界的小按钮,非常小的文本等中使用sp表示文本

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

同样,如果您有一个支持所有尺寸的应用程序,则添加xxxhdpi资产会大大增加应用程序的大小。但是现在xxxhdpi电话很常见,因此我们必须至少在侧栏,工具栏和底部栏中包括xxxhdpi资产。最好转移到矢量图像,以在所有屏幕尺寸上获得统一且质量更好的图像。

另请注意,人们在手机中使用自定义字体。因此,缺少字体会导致间距和全部问题。说自定义字体的文本大小12sp可能比默认字体多花一些像素。

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


43
  • px-一个像素,与CSS,JavaScript等中使用的像素相同。
  • sp-与比例无关的像素
  • dip-与密度无关的像素

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


39

我见过一篇不错的文章,关于为不同的屏幕分辨率设计Android应用程序UI,我想把它留在这里仅供那些在该领域搜索的人使用。是的,我知道它在Google文档中有所描述(并在上面的帖子中提到),我读过,但这对我不好(是的,我可能太愚蠢了))。我仍然不清楚如何设计能够处理不同屏幕尺寸的布局。当我需要为不同的屏幕实现“灵活的” UI布局时,我讨厌DP概念。(嘿,iOS开发人员-是的,您说对了,这就是Storyboard的概念)。

Android的UI概念不错,但不幸的是缺少iOS Storyboard功能。在Android中设计灵活的UI绝非易事(最好)。

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

JMSTUDIO博客:-确定Android应用程序的屏幕大小

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

为了设计用于不同屏幕尺寸的应用程序用户界面,我们的初始设计必须满足每种屏幕尺寸所需的最小空间。Android为每种广义屏幕类型定义了最小尺寸(以dp为单位)。这是Android屏幕尺寸指南。 dp中Android的最小屏幕尺寸 当我们获得以dp为单位的屏幕尺寸时,仅设计Android应用程序用户界面还不够。对于每种屏幕尺寸,我们需要为每种密度准备图形和位图图像。这是Android屏幕密度指南。 Android密度指南(dpi)

为了便于计算,我们可以遵循四个广义密度之间的3:4:6:8缩放比例。如果我们为ldpi设备创建36×36像素的图片,则其他密度的图片尺寸对于mdpi为48×48,对于hdpi为72×72,对于xhdpi为96×96。

如何在Photoshop中设计Android Apps UI

由于密度独立单位dp,许多设计师在用photoshop或其他基于像素的图形设计工具中设计Android应用程序UI时遇到问题。设计人员不知道如何将dp映射到像素。Google也没有为他们提供清晰的Android UI设计指南,尽管它们提供了dp和像素翻译的基本公式。

按照Android的定义,在160 dpi设备(mdpi)下1pd等于1px。因此,我们要为密度为mdpi的xlarge Android设备设计一个Android应用,我们可以将像素的UI尺寸定义为宽度960像素和高度720px;遵循相同的映射规则,我们可以获得以下Android App屏幕尺寸UI设计指南:

像素指南中的Android应用屏幕尺寸

添加:如果您也对“灵活的” UI感兴趣,请查看以下库:一个提供新大小单位sdp(可缩放dp)的Android SDK。此大小单位与屏幕大小成比例(在有关SDP库的答案中也提到了这一点)

ADDED2 Google终于了解了iOS Storeboard UI概念的实用性,适用ConstraintLayout于Android世界:使用ConstraintLayout构建响应式UI


32

1) dp: (density independent pixels)

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


2) sp: (scale independent pixels)

该单位根据屏幕dpi(类似于dp)以及用户的字体大小首选项进行缩放。


3) px: (pixels)

屏幕上的实际像素或点。


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

Android开发人员指南>尺寸
Android开发人员指南>屏幕


29

屏幕尺寸在Android是分为不同的类别ldpimdpihdpixhdpixxhdpixxxhdpi屏幕密度屏幕区域(如英寸)内的像素数量。通常,它以每英寸点数(dpi)为单位。

PX(Pixels):

  • 我们通常映射到屏幕像素的标准像素。px是指绝对像素。如果要给出宽度或高度的绝对像素,则使用此选项。不建议。

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

  • dip == dp。在较早的Android版本中,使用dip,后来更改为dp。这是的替代方案px

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

  • dp强烈建议使用代替px。使用dp,如果你想提宽度高度成长和基于屏幕尺寸缩小动态。

  • 如果我们给出dp/dip,android将根据160像素大小的屏幕自动计算像素大小。

SP(Scale independent pixels):

  • 根据用户的字体大小首选项进行缩放。字体应使用sp

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

Android文档说:

指定尺寸时,请始终使用dpsp单位。A dp是与密度无关的像素,它与160处的像素的物理尺寸相对应dpi。An sp是相同的基本单位,但会根据用户的首选文本大小进行缩放(这是与缩放无关的像素),因此在定义文本大小时应使用此度量单位


21

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

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

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

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

1 px / 1dp = 160 dpi / 160 dpi

2 px / 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 x800。另一方面,手机具有更高的像素密度,因此其与密度无关的像素数量是物理像素的一半。像素。因此,一部电话具有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,谷歌


19

sp:独立于比例的像素

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

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


19

像素密度

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

计算像素密度

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

适合英寸的像素数称为像素密度。高密度屏幕每英寸具有比低密度屏幕更多的像素。结果,相同像素尺寸的UI元素在低密度屏幕上显得较大,而在高密度屏幕上则较小。

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

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

高密度与低密度显示器

密度独立

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

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

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

与密度无关的像素,记为dp(读作“ dip ”),是可伸缩的单位,可以缩放以在任何屏幕上具有统一的尺寸。材质UI使用与密度无关的像素,以不同密度在屏幕上一致地显示元素。

  1. 低密度屏幕显示密度独立
  2. 高密度屏幕以密度独立显示

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


16

Pixels(px) –对应屏幕上的实际像素。如果要给出宽度或高度的绝对像素,则使用此选项。

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

与比例无关的像素(sp) –类似于dp单位,但也通过用户的字体大小首选项进行缩放。建议您在指定字体大小时使用本机,以便针对屏幕密度和用户喜好进行调整。

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

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


15

我想提供一种简单的理解方法dp。实际上,我认为这dp是最容易理解的一种。dp只是一个物理长度单位。与mm或的尺寸相同inch。这只是方便我们写的50dp60dp而不是50/160 inch60/160 inch,因为一个dp只是1/160 inch无论屏幕大小或分辨率。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.