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

测量单位之间的区别是什么px,dip,dp和sp?

1434553 次浏览

来自 Android 开发者文档:

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

  2. 进去
    Inches -基于屏幕的物理大小。
    1英寸或者2.54厘米


  3. > 毫米-基于屏幕的物理大小。

  4. 文件
    根据屏幕的实际尺寸,大于 分数-1/72英寸。

  5. Dp 下降
    > 独立于 密度的像素-一个基于屏幕物理密度的抽象单位。这些单位相对于160 所以一个 dp 就是160dpi 屏幕上的一个像素。像素与分辨率的比值会随着屏幕密度的变化而变化,但不一定成正比。注意: 编译器同时接受“ dip”和“ dp”,尽管“ dp”与“ sp”更加一致。

  6. (英语)
    > 可缩放像素 或者 尺度无关像素尺度无关像素-这类似于 dp 单元,但它也可以根据用户的字体大小首选项进行缩放。我们推荐你 在指定字体大小时使用此单元,因此它们将被调整 对于屏幕密度和用户的喜好。注意,Android 的文档对于 sp实际代表的含义是不一致的,一个 医生表示“与尺度无关的像素”,另一个 其他表示“可缩放像素”。

来自 了解 Android 中的密度独立性:

密度桶 屏幕密度 体型 像素大小
低密度脂蛋白 120 dpi 0.5 x 0.5英寸 0.5 in * 120 dpi = 60x60 px
Mdpi 160dpi 0.5 x 0.5英寸 0.5 in * 160 dpi = 80x80 px
Hdpi 240dpi 0.5 x 0.5英寸 0.5 in * 240 dpi = 120x120 px
Xhdpi 320dpi 0.5 x 0.5英寸 0.5 in * 320 dpi = 160x160 px
Xxhdpi 480dpi 0.5 x 0.5英寸 0.5 in * 480 dpi = 240x240 px
Xxxhdpi 640dpi 0.5 x 0.5英寸 0.5 in * 640 dpi = 320x320 px
单位 描述 单位物理英寸 密度独立? 每个屏幕上都有相同的尺寸?
Px 像素 不一样 没有 没有
进去 几英寸 1 是的 是的
毫米 25.4 是的 是的
文件 分数 72 是的 是的
Dp 密度独立像素 160 是的 没有
(英语) 比例独立像素 160 是的 没有

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

关于这一点,以及如何实现对不同大小和密度的多个屏幕的最佳支持,几乎所有的内容都在这里有详细的文档说明:

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

屏幕密度
控件的物理区域内的像素数 屏幕; 通常称为 dpi (每英寸点数) “低”密度的屏幕在给定的物理区域内有较少的像素, 与“正常”或“高”密度的屏幕相比。为了简单起见, Android 将所有实际屏幕密度分为六大类 密度: 低、中、高、特高、特高和 超级超级超级高。

方向 < br/> 从用户的角度看屏幕的方向 这是风景或肖像,这意味着屏幕的 长宽比分别是宽的或高的 只有不同的设备才能在不同的方向工作 默认值,但是方向可以在运行时更改,当用户 旋转装置。

分辨率 < br/> 上的物理像素总数 当添加对多个屏幕的支持时,应用程序会 不直接与决议工作; 应用程序应该关注 只有屏幕大小和密度,如指定的广义 尺寸和密度组。

与密度无关的像素(dp) < br/> A 虚拟 定义 UI 布局时应该使用的像素单位,以表示 与密度无关的布局尺寸或位置。 与密度无关的像素相当于160上的一个物理像素 Dpi 屏幕,这是系统为一个 “中等”密度屏幕。在运行时,系统透明地处理 根据实际密度,根据需要对 dp 单位进行任何缩放 在使用中的屏幕。 dp 单位到屏幕像素的转换是 简单: px = dp * (dpi / 160). 例如,在240dpi 的屏幕上,1 dp 等于1.5个物理像素 定义应用程序的 UI,以确保在 不同密度的筛网。

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

我将详细说明 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控件。您需要为支持的屏幕大小创建不同大小的图像:

  • 用于 mdpi 的 100 * 100 px图像
  • 用于 hdpi 的 150 * 150 px图像
  • Xhdpi 的 200 * 200 px图像

基本上 px 应用的唯一时间是一个 px,这是如果你想在屏幕上像分割器那样精确的一个像素:

在大于160dpi 的情况下,你可以得到2-3个像素,

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

此外,你应清楚了解以下概念:

屏幕大小:

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

屏幕密度:

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

方向:

从用户的角度看屏幕的方向。这是横向的或纵向的,这意味着 屏幕的长宽比分别是宽或高。请注意 不仅不同的设备有不同的操作方向 默认情况下,但方向可以在运行时更改时,用户 旋转装置。

决心:

屏幕上的物理像素总数。当添加对多个屏幕的支持时,应用程序不能直接工作 应用程序应该只关心屏幕 尺寸和密度,由广义尺寸和密度指定 团体。

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

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

参考资料: Android 开发者网站

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

你可以在它的位置同时使用 dpdip

通过改变 Settings->Accessibility->Large Text选项,可以在运行时看到从官方文档复制的答案中提到的 dpsp单元之间的差异“ 用户的字体大小首选项”。

Large Text选项迫使文本变成 1.3倍大。

private static final float LARGE_FONT_SCALE = 1.3f;

这当然是依赖于供应商的,因为它位于 软件包/应用程序/设置中。

我已经计算了下面的公式,使转换 dpidpsp enter image description here

来源1

来源2

来源3 : (来源3的数据在下面给出)

这些是 XML 中定义的维度值。指定了一个维度 一个数字后面跟着一个度量单位。例如: 10px,2英寸, 5% Android 支持以下计量单位:

Dp

密度无关的像素-一个抽象的单位,是基于 屏幕的物理密度。这些单位相对于160 dpi (每英寸点数)屏幕,其上的1dp 大致等于1px 在密度较高的屏幕上运行时,用于绘制的像素数 1dp 的放大倍数与屏幕的 dpi 相适应。 同样,当在低密度屏幕上,使用的像素数 数值与像素的比率会随 筛网密度,但不一定成正比 单位(而不是 px 单位)是一个简单的解决方案,使视图 在您的布局尺寸适当调整不同的屏幕 换句话说,它为现实世界提供了一致性 不同设备上 UI 元素的大小。

(英语)

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

文件

点-1/72英寸的基础上的物理尺寸的屏幕。

Px

像素-对应于屏幕上的实际像素 因为实际的表现形式可能会有所不同,所以不建议采用 每个设备可能有不同的像素数 并且可能有更多或更少的总像素在屏幕上可用。

毫米-基于屏幕的物理大小。

进去

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

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

在哪里使用什么 & px & dp 之间的关系?

与密度无关的像素(dp)

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

Px = dp * (dpi/160).

例如,在一个240dpi 的屏幕上,1 dp 等于1.5个物理像素。在定义应用程序的 UI 时,应始终使用 dp 单元,以确保 在不同密度的屏幕上正确显示用户界面。

理解像素对 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

上面已经解释过了。在布局文件中尽量避免。但在某些情况下,需要使用 px。例如,ListView 分隔线。在这里,px 更适合提供一个像素线作为跨屏幕分辨率的分隔符。

(英语)

对字体大小使用 sp。然后,当设备字体大小发生变化时,只有应用程序内部的字体会发生变化(即 Display-> Fonts on Device)。如果你想在应用程序中保留一个静态大小的字体,你可以用 dp 给出字体尺寸。在这种情况下,它永远不会改变。开发人员可能对某些特定的屏幕有这样的需求,因此,开发人员可以使用 dp 而不是 sp。在所有其他情况下,建议使用 sp。

dpdip。用它做所有事情(边距、填充等)。

仅对{ text-size }使用 sp


为了在不同的屏幕密度上获得相同的尺寸,Android 会在运行时将这些单位转换成像素,所以不需要进行复杂的数学计算。


在不同的屏幕尺寸上看到 pxdpsp之间的区别。

Enter image description here

资料来源: Android 编程: 大书呆子农场指南

  • Px-一个像素,与 CSS、 JavaScript 等中使用的像素相同。
  • 与 sp 尺度无关的像素
  • 与倾角密度无关的像素

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

我只会用 dp。

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

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

虽然“ sp”字体的想法有一颗善良的心,但它是一个糟糕的想法。

Dpi-

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

像素

  • 用于映射屏幕像素

点数

  • 大约1/72英寸,就物理屏幕尺寸而言。

英寸 - 屏幕大小(1寸 = 2.54厘米)。

毫米 关于物理屏幕尺寸。

与尺度无关的像素。

  • 根据用户的字体大小偏好。
  • 字体应该是‘ sp’。

  • = = dp
  • 与密度无关的像素。
  • 它根据屏幕密度而变化。
  • 在160dpi 的屏幕上,1 dp = 1像素。
  • 除文本字体大小外,使用 dp。

在标准中,dp 和 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

您可以从下面的图片中看到 pxdp之间的差异,您还可以发现,pxdp不能保证在不同的屏幕上有相同的物理尺寸。

enter image description here

尺度无关像素

与密度无关的像素

Dpi = 每英寸点数

我们应该避免使用 (英语)

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

Android 支持不同的屏幕分辨率

  • Ldpi (低) ~ 120 dpi
  • Mdpi (中等) ~ 160 dpi
  • Hdpi (高) ~ 240 dpi
  • Xhdpi (超高) ~ 320 dpi
  • Xxhdpi (超高) ~ 480 dpi
  • Xxxhdpi (超高超高) ~ 640dpi

一个120dpldpi 设备有120像素在1英寸大小。

其他密度也一样。

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

像素 = dp * (密度/160)

所以240 dpi 设备的1 dp = 1 * (240/160) = 3/2 = 1.5像素。

480dpi 设备的1dp 将等于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();

下面是 Android 使用的公式:

Px = dp * (dpi/160)

其中 dpi 是下列屏幕密度之一。对于所有可能密度的列表 到这儿来

它定义了“ DENSITY _ *”常量。

  • Ldpi (低) ~ 120dpi
  • Mdpi (中等) ~ 160dpi
  • Hdpi (高) ~ 240dpi
  • Xhdpi (超高) ~ 320dpi
  • Xxhdpi (超高) ~ 480dpi
  • Xxxhdpi (超高超高) ~ 640dpi

取自 给你

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

所以,假设你想要一个60dp 的高清屏幕图像,那么60dp 的物理像素大小是:

px = 60 * (240 / 160)

1) dp: (density independent pixels)

当屏幕分辨率增加时(当每英寸有更多的点/像素时) ,以一个 dp 单位表示的像素数将会增加。相反,在分辨率较低的设备上,以 dp 为单位表示的像素数将会减少。因为这是一个相对单位,所以需要有一个基线来与之比较。这个基线是一个160dpi 的屏幕。这是方程式: px = dp * (dpi / 160).


2) sp: (scale independent pixels)

该单元根据屏幕 dpi (类似于 dp)以及用户的字体大小偏好进行调整。


3) px: (pixels)

屏幕上的实际像素或点。


详情请浏览

Android 开发指南 > 维度
Android 开发指南 > 屏幕

Android 中的屏幕大小 分为 ldpimdpihdpixhdpixxhdpixxxhdpi几类。屏幕密度是屏幕上一个区域(如英寸)内的像素数量。一般以每英寸点数计(dpi)。

PX(Pixels):

  • 我们通常的标准像素映射到屏幕像素。px意味着绝对像素。如果您想给出宽度或高度的绝对像素,则使用此方法。不推荐。

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

  • 在早期的 Android 版本中,使用了下沉,后来改为 dp。这是 px的替代品。

  • 通常我们从不使用 px,因为它是绝对值。如果您使用 px来设置宽度或高度,并且如果该应用程序正被下载到不同屏幕大小的设备中,那么该视图将不会按照屏幕原始大小伸展。

  • 强烈建议使用 dp代替 px。使用 dp,如果你想提到宽度和高度的增长和收缩动态基于屏幕大小。

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

SP(Scale independent pixels):

  • 根据用户的字体大小选择缩放。字体应该使用 sp

  • 当提到适合不同屏幕尺寸的字体大小时,请使用 sp。这类似于 dp。使用 sp特别是字体大小增长和缩小动态基于屏幕大小

Android 文档显示:

在指定尺寸时,始终使用 dpsp单位 与密度无关的像素,它对应于 像素在160dpi。一个 sp是相同的基本单位,但是被缩放的 用户首选的文本大小(它是一个与比例无关的像素) ,因此 当定义文本大小时,应该使用这个度量单位

定义

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

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

Android 提供 多密度别名

  • Ldpi (低) ~ 120dpi
  • Mdpi (中等) ~ 160dpi
  • Hdpi (高) ~ 240dpi
    • 2015年的大部分设备都在这里
  • Xhdpi (超高) ~ 320dpi
    • 苹果 iPhone 4/5/6,Nexus 4
  • Xxhdpi (超高) ~ 480dpi
    • Nexus 5
  • Xxxhdpi (超高超高) ~ 640dpi

下降 Dp与密度无关的像素,也就是说,它们对应的像素大小取决于物理密度。

  • Mdpi 上的1dp = 1px

enter image description here

Sp 或者 喝一口与尺度无关的像素。当 大字体选项在 Settings > Accessibility中打开时,它们被缩放

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

用什么?

对于文本大小使用 (英语)

其他所有事情都使用 Dp

屏幕大小 Android分为类别 smallmediumlargeextra largedouble-extratriple-extra。屏幕密度是指屏幕上一个区域(比如一英寸)内的像素数。一般来说,它是以每英寸点数(dpi)来衡量的。屏幕密度分为低、中、高和超高。分辨率是屏幕上像素的总数。

  • 密度独立像素,根据屏幕密度变化。在160dpi 的屏幕上,1 dp = 1像素。除了字体大小,总是使用 dp。
  • 在早期的 Android 版本中,使用了 dip,后来改为 dp。
  • 独立像素,根据用户的字体大小选择缩放。字体应该使用。
  • 我们通常的标准像素映射到屏幕像素。
  • 在: 英寸,关于物理屏幕大小。
  • 毫米: 毫米,关于物理屏幕尺寸。
  • 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,谷歌建议的设计比例是3:4:6:8:12

一个150px X 150px 的图像将占用,

  • 150dp X 150dp 屏幕空间(mdpi)
  • 100dpX100dphdpi 屏幕空间
  • Xhdpi 中的75dp X 75dp 屏幕空间

当您希望在所有 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/

我想提供一个简单的方式来理解 dp。事实上,我认为 dp是最容易理解的。dp只是一个物理长度单位。它与 mminch具有相同的尺寸。这只是方便我们编写 50dp60dp而不是 50/160 inch60/160 inch,因为一个 dp只是 dp0无论屏幕大小或分辨率是什么。

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

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

Android 有不错的 UI 概念,但不幸的是缺乏 iOS 的故事板功能。在 Android 系统中设计灵活的用户界面并不是一件容易的事情(往好了说)。

下面是一篇帮助我理解如何在 Android 中为不同屏幕尺寸制作布局的文章:

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

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

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

为了便于计算,我们可以遵循3:4:6:8的比例 四个广义密度。如果我们创建一个36 × 36像素的图片 其余密度图片尺寸为48 × 48为 mdpi, Hdpi 为72 × 72,xhdpi 为96 × 96。

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

许多设计师在设计 Photoshop 或其他像素的 Android 应用程序用户界面时都会遇到问题 基于图形设计工具,因为密度无关单位,dp。 设计师不知道如何将 dp 映射到像素,谷歌也没有提供 一个清晰的 Android 用户界面设计指南给他们,虽然他们提供了一个基本的 Dp 和像素平移公式。

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

Android App Screen Size in Pixel Guideline

添加 : 如果您也对“灵活的”用户界面感兴趣,那么可以看看这个库: 一个 Android SDK,它提供了一个新的大小单位 -sdp (可伸缩的 dp)。这个尺寸单位随着屏幕尺寸的变化而变化(在这里的一个答案中也提到了,关于 SDP库)

谷歌终于明白了 iOS Storeboard UI 概念的有用性,下面是安卓世界的 ConstraintLayout: 使用 ConstraintLayout 构建响应式用户界面

请阅读来自社区维基的答案。 下面提到的是除了上述答案之外还需要考虑的一些信息。大多数 Android 开发者在开发应用程序时都忽略了这一点,所以我在此补充以下几点。

尺度无关像素

与密度无关的像素

Dpi = 密度像素

我已经看过上面的答案了... ... 没有找到完全正确的答案。 Sp 表示文本大小,dp 表示布局边界-标准。 但大多数设备的 如果不小心使用,sp 的文本大小会打破布局

Sp 采用设备的文本大小,而 dp 采用设备密度标准(从不改变设备) 假设100sp 文本可以占据80% 的屏幕或100% 的屏幕,这取决于设备中设置的字体大小

enter image description here

您也可以使用 sp 作为布局边界,它将工作:) 没有标准的应用程序使用 sp 为整个文本

考虑到用户体验,对文本大小使用 sp 和 dp。

  • 不要在工具栏中使用 sp 表示文本(可以使用 android 维度来表示不同屏幕大小的 dp)
  • 不要在小的有界按钮、非常小的文本等中使用 sp 表示文本

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

类似地,如果您有一个支持所有维度的应用程序,添加 xxxhdpi 资产会大大增加应用程序的大小。但是现在 xxxhdpi 手机已经很常见了,所以我们必须至少在侧边栏、工具栏和底部工具栏中包含 xxxhdpi 资源。最好移动到矢量图像,以便为所有屏幕尺寸提供统一且质量更好的图像。

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

参考谷歌开发人员网站的屏幕密度和基础密度的安卓细节。 Https://developer.android.com/training/multiscreen/screendensities

尺度无关像素

你应该在文本中使用它,因为它会根据用户在他的设备中使用的字体大小自动缩放。

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

SDP -一个可伸缩的尺寸单元-基本上它不是一个单元,而是针对不同屏幕尺寸的尺寸资源。

尝试从 Intuit 的 SDP库。它非常方便地解决单元问题,你可以 快速支持多个屏幕

用法

android:paddingBottom="@dimen/_15sdp"为阳性,android:layout_marginTop="@dimen/_minus10sdp"为阴性

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

注意

在大多数情况下,你仍然需要为平板电脑设计一个不同的布局。

例子

<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 表示文本大小,但我更喜欢使用 你好表示文本大小。

有关详细信息,请查看 图书馆 GitHub 页面

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

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

密度独立的像素(dp 或倾斜) 允许设计师创建以预期方式出现的资产,而不管目标设备的分辨率或密度。

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

1 px/1dp = 160 dpi/160 dpi

2px/1dp = 320dpi (2x)/160dpi

在哪里,

Dpi 是每英寸点数

所以,在320dpi 时,1 dp 等于2px。

配方奶粉

Px/dp = dpi/160dpi

每英寸点数(dpi)是显示屏上锐度(即被照亮点的密度)的度量单位。在给定的图片分辨率每英寸的点将不同的基础上的整体屏幕大小,因为相同数量的像素分布在不同的空间。

使用与密度无关的像素可以帮助我们处理这样一种情况,即两个设备具有相同的像素分辨率,但空间大小不同。假设在一个案例中,平板电脑和手机分别具有相同的像素分辨率1280 × 800像素(160dpi)和800 × 1280像素(320dpi)。

现在因为平板电脑处于基线密度(160dpi) ,它的物理和密度独立的像素大小是相同的,1280x800。另一方面,手机有更高的像素密度,所以它的密度独立像素只有物理像素的一半。所以一部手机有400 * 640密度的独立像素。因此,使用与密度无关的像素可以更容易地在脑海中勾勒出平板电脑比手机拥有更多空间的画面。

类似地,如果你有两个屏幕大小相似但像素密度不同的设备,比如一个是800 × 1280像素(320dpi) ,另一个是400 × 640像素(160dpi) ,我们不需要为这两个设备定义完全不同的布局,因为我们可以根据密度独立的像素来衡量资产,这两个设备是相同的。

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

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

缩放无关像素(sp) 是字体大小的首选单位。 为了方便访问,Android 允许用户自定义设备的字体大小。阅读文本有困难的用户可以增加他们的设备的字体大小。你通常可以在你的手机或平板电脑的显示设置中找到这个选项,字体大小。它通常也可以通过可访问性设置获得。

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

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

参考文献 : Udacity,Google

Dp 到像素的比值会随着屏幕密度的变化而变化,但不一定成正比。

注意 : 编译器同时接受“ 蘸一下”和“ Dp”,尽管“ Dp”与“ (英语)”更一致。

与比例无关的像素 ——这类似于 Dp单元,但它也可以根据用户的字体大小首选项进行缩放。

像素(px) -对应于屏幕上的实际像素。如果您想给出宽度或高度的绝对像素,则使用此方法。

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

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

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

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

像素密度

屏幕像素密度和分辨率因平台而异。与设备无关的像素和可伸缩像素是一些单元,它们提供了一种灵活的方式来适应跨平台的设计。

计算像素密度

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

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

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

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

Hight density vs lower density displays

密度独立性

屏幕像素密度和分辨率因平台而异。与设备无关的像素和可伸缩像素是一些单元,它们提供了一种灵活的方式来适应跨平台的设计。

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

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

与密度无关的像素 ,写成 Dp(读作“ 下降”) ,是灵活的单位,可以缩放到任何屏幕上具有统一的尺寸。材质 UI 使用与密度无关的像素在不同密度的屏幕上一致地显示元素。

  1. 低密度屏幕显示与密度无关
  2. 高密度显示屏与密度无关

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

Px = 意味着可以使用屏幕上的像素进行像素计算 px = dp * (dpi/160) 与密度无关的像素等于 dp Sp = 应该只用于文本

Android px,dp,sp

  • pixels像素(绝对绝对值)
  • 下降-允许你不依赖于像素,有相同的结果在屏幕上不同的像素每英寸
  • Scale-independent pixels sp,啜饮-与 dp 相同,但字体

[ iOS 像素 vs 点 vs 单位]