dp、dip、dpi、ppi、像素和英寸之间有什么联系?

30

我正在阅读关于 dp、dip、px、sp 的度量单位,但是我仍有一些关于 dp/dpi 与 ppi 与 px 与 inch 的问题。我无法比较它们...那么一英寸是最大的吗?

他们说 160 dpi 意味着每英寸有 160 像素。这是否意味着 1 英寸包含 160 像素?

他们还说在 160 dpi 屏幕上的 1 个像素 = 1 dp。这是否意味着 1 个像素和 1 个 dp 相等?

最后,为什么我们应该使用 dp 而不是 px?我知道这是理想情况,但为什么


请记住,许多Android屏幕具有不同的分辨率和密度差异,请查看以下链接是否有所帮助:https://dev59.com/A3I-5IYBdhLWcg3wEELu - Steve Blackwell
@steve blackwell:我正在阅读那个!但是我无法进行比较。 \ - Rebooting
6个回答

51
你应该(几乎)总是使用灵活的尺寸单位,如 dp,即密度无关像素,因为一个设备上的 300px 并不一定与另一个设备上的 300px 相同。最大的实际影响是,你的布局在具有不同密度的设备上看起来会明显不同于你设计目标的设备。
  • dpdip 意味着密度无关像素
  • dpippi 意味着每英寸点数(或像素)
  • inch 是连接实际屏幕大小的物理测量单位
  • px 意味着像素-一个像素根据密度填充任意数量的屏幕区域。
例如,在 160dpi 屏幕上,1dp == 1px == 1/160in,但在 240dpi 屏幕上,1dp == 1.5px。因此,不,1dp != 1px。只有在 160dpi 屏幕上才存在 完全相等的一种情况,那就是 1dp == 1px。物理测量单位如英寸应该永远不会成为你设计的一部分-除非你在制作标尺。
计算出每个像素等于多少 dp 的简单公式是 px = dp * (dpi / 160)

3
市场上有许多屏幕密度,因此你肯定可以使用这些计算。我不确定你为什么要这样做,但你确实可以这样做。例如,如果你想知道在240dpi的屏幕上300 dp会占用多少像素,则 300*(240/160) = 450 像素 - Chris Cashwell
4
实际上,1英寸约为160dp,因此将其视为某种测量单位是可以的... - android developer
1
@TusharPandey DP 是 Density-independent Pixel,DPI 是每英寸点数。DP 是基于给定屏幕像素密度的抽象单位,而 DPI 是每英寸的“点”数。您可以根据屏幕的 DPI 值推导出屏幕上的 DP 数量。 - Chris Cashwell
2
160 dp = 1英寸。根据Google规格:“dp对应于160 dpi下像素的物理尺寸。”在160 dpi下,像素的物理尺寸恰好为1/160英寸。因此,160 dp = 1英寸。 - user984003
通过1dp == 1px == 1in,你的意思是一英寸吗?那当然是错误的!1dp恰好等于1/160英寸。 - EmJiHash
显示剩余5条评论

11

dp是像英寸一样的物理测量单位。(没错,就是这样。继续往下看)

"dp对应于160dpi下像素的物理大小"(https://developer.android.com/training/multiscreen/screendensities.html#TaskUseD)

在160dpi下像素的物理大小正好是1/160英寸。因此一个dp的大小为1/160英寸。 160 dp = 1 英寸。

px是屏幕上一种略带任意性的计量单位。

有关dp在不同设备上转换为px的示例,请参见此处:

https://dev59.com/8mAf5IYBdhLWcg3wlDYD#39495538


1
我在想为什么他们会提出这个新的度量单位“dp”,而不是使用英寸或厘米。 - Massimo Fazzolari
不幸的是,将dp与物理尺寸等同起来已经不再是正确的方法。现在许多设备都允许您更改屏幕缩放级别,这意味着每个缩放级别上的160dp具有不同的物理大小。这些工作是通过更改设备的“逻辑”屏幕密度(320dpi、240dpi等)来完成的。因此,要精确,当逻辑dpi匹配物理dpi(每英寸物理像素)时,160dp为1英寸。请注意,其中一些设备不会默认为1倍缩放。例如,三星S5e的物理密度约为288dpi,但出厂默认的逻辑密度为360dpi。 - Christian García

8

dp、dip、dpi、ppi、像素和英寸之间有什么关系?

针对Android开发:

dp = dip
dpi = ppi
inch x dpi = pixels
dp = 160 x inch
dp = 160*pixels/dpi

因此,在160dpi的手机上(mdpi):

2 inches = 320 dp
2 inches = 320 pixels

在一个180 dpi的手机上:
2 inches = 320 dp
2 inches = 360 pixels

请注意,无论屏幕大小如何,2英寸始终为320dp,其中1dp是1/160英寸的物理距离。

将dp转换为像素的公式很有趣:

dp = 160*pixels/dpi

等同于:

dp = pixels/(dpi/160)

dpi/160 是一个有趣的因素。它是相对于 Android 的 mdpi 二进制文件的密度比率,以及您必须将图形按比例缩放到各种资源二进制文件的数量。您会在这个页面上看到这个因素被提到了几次,0.75 是 ldpi 的因子。


1
我会用一个例子来解释。
float density = context.getResources().getDisplayMetrics().density;
float px = someDpValue * density;
float dp = somePxValue / density;

密度等于
.75 on ldpi (120 dpi)
1.0 on mdpi (160 dpi; baseline)
1.5 on hdpi (240 dpi)
2.0 on xhdpi (320 dpi)
3.0 on xxhdpi (480 dpi)
4.0 on xxxhdpi (640 dpi)

例如,

我有一部三星S5手机,分辨率为432 dpi (http://dpi.lv/#1920×1080@5.1″)。

因此,density = 432/160 = 手机dpi/基准值 = 2.7

假设我的顶栏高度为48dp。这是相对于基准值(160dpi)的参考值。

所以,相对于我的S5手机,它将是48dp * 2.7

然后如果我想查看实际高度:

它将是(48dp * 2.7) / 432 dpi = 0.3英寸


0

当我们提到显示器而非安卓系统时,DP实际上指的是点距(Dot Pitch),这个词最初起源于CRT显示器,它是指两个相邻像素之间的对角线距离(以毫米为单位)。在LCD显示器中,像素更大一些,假设像素彼此相邻并且没有间隙(通常有一个非常小的间隙,但为了简单起见,我们假设它为零),则每个像素的中心之间的对角线距离等于像素的对角线长度。 DP值越低,图像越清晰。

DP = 25.4÷ppi 0.25 DP是标准值,边缘呈锯齿状 0.20 DP被认为更清晰 160 ppi = 0.158 DP

因此,DiP实际上是1000 x DP的四舍五入取整值,这两者并不是完全等价的,只是十分接近。

正如之前所述,您不应该基于像素大小来确定某些东西,因为您可以进行缩放。这里谈到的是屏幕上显示的清晰程度。

在显示器上,如果您想在20英寸的距离(显示器到眼睛的平均距离)下获得清晰度(< 0.20 DP中等清晰度/0.16 DP超清晰),需要以下分辨率: 1920x1080(高清)17.4英寸/14英寸 3840x2160(4K)35英寸/27.8英寸 高分辨率手机可能具有0.05 DP(约500 ppi),或比超清晰监视器高3倍,但观看距离缩短了3倍。
显示器尺寸大于这些尺寸会出现像素化,而尺寸小则更清晰。
另外值得注意的是,72像素/英寸是Mac的标准,非常老旧。96 ppi是Windows分辨率的参考标准。Photoshop最初是为Mac设计的。

不应该根据像素大小来设定物品的原因是因为这会受到像素密度影响而导致实际尺寸大相径庭。 - Ryan M

0

DP是仅考虑屏幕物理尺寸时的分辨率。当您使用DP时,它会将您的布局缩放到具有不同像素密度的其他类似尺寸的屏幕。

偶尔您实际上需要像素,当您在代码中处理尺寸时,您始终在处理真实像素,除非您将它们转换。


那么创建图像时,像素分辨率是相同的,只是更改物理尺寸?因此,在使用Photoshop时,您可以将默认的每英寸72像素粘贴到正确的像素宽度/高度中? - Vass

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