【问题标题】:What is the difference between "px", "dip", "dp" and "sp"?“px”、“dip”、“dp”和“sp”有什么区别?
【发布时间】:2011-01-02 18:35:46
【问题描述】:

Android 计量单位有什么区别?

  • 像素
  • 浸入
  • dp
  • sp

【问题讨论】:

标签: android android-layout user-interface dimension units-of-measurement


【解决方案1】:

来自Android Developer Documentation

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


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

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

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

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

  6. sp
    > Scaleable Pixels OR scale-independent pixels - 这类似于 dp 单位,但它也可以根据用户的字体大小偏好进行缩放。建议你 指定字体大小时使用此单位,因此它们将被调整 对于屏幕密度和用户的偏好。请注意,Android 文档与 sp 实际代表的含义不一致,doc 表示“与缩放无关的像素”,other 表示“可缩放像素”。

来自Understanding Density Independence In 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 Physical Inch Density Independent? Same Physical Size 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 Independent Pixels ~160 Yes No
sp Scale Independent Pixels ~160 Yes No

更多信息也可以在Google Design Documentation找到。

【讨论】:

    【解决方案2】:

    关于这方面的几乎所有内容以及如何实现对不同尺寸和密度的多个屏幕的最佳支持都在此处进行了详细记录:

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

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

    方向
    从用户的角度看屏幕的方向 看法。这是横向或纵向,这意味着屏幕的 纵横比分别为宽或高。请注意,不是 只有不同的设备在不同的方向上运行 默认值,但是当用户在运行时方向可以改变 旋转设备。

    分辨率
    上的物理像素总数 一个屏幕。添加对多个屏幕的支持时,应用程序会 不能直接使用分辨率;应用程序应该关注 仅具有屏幕尺寸和密度,如广义 大小和密度组。

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

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

    【讨论】:

      【解决方案3】:

      我会详细说明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 图片

      【讨论】:

      • 字体大小是如何表示的?在dp或sp?我有一个应用程序,文本在某些模式下显示得更大。所以它涉及到下一行或完全占据空间。如何将此字体大小设置为在 android 中显示为好
      【解决方案4】:

      px - 像素 - 每比例的点对应于屏幕上的实际像素。

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

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

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

      dp - 与密度无关的像素 - 基于屏幕物理密度的抽象单位。 这些单位是相对于 160 dpi 屏幕的,所以一个dp 是 160 dpi 屏幕上的一个像素。 dp与像素的比例会随着屏幕密度而变化,但不一定成正比。 注意:编译器同时接受dipdp,尽管dpsp 更一致。

      sp - scalable pixels - 这就像 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
      

      【讨论】:

        【解决方案5】:

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

        屏幕尺寸:

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

        屏幕密度:

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

        方向:

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

        分辨率:

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

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

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

        参考:Android developers site

        【讨论】:

          【解决方案6】:

          dpdip。将它用于所有内容(边距、填充等)。

          仅将sp 用于{text-size}。


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


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

          来源:Android Programming: The Big Nerd Ranch Guide

          【讨论】:

            【解决方案7】:

            定义

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

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

            Android 给alias names to several densities

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

            dipdp与密度无关的像素,即它们对应的像素或多或少取决于物理密度。

            • 1dp = mdpi 上的 1px

            spsip 是一个与尺度无关的像素。在 Settings > Accessibility

            中打开 Large Text 选项时,它们会被缩放
            • 1sp = 1dp
            • 1sp = 1.2dp 可访问大文本

            用什么?

            使用 sp 作为文本大小。

            dp 用于其他所有内容。

            【讨论】:

              【解决方案8】:

              我计算了下面的公式来进行转换 dpidpsp

              【讨论】:

              • 应该是ppi而不是dpi
              【解决方案9】:

              Source 1

              Source 2

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

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

              dp

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

              sp

              Scale-independent Pixels - 这就像 dp 单位,但它也是 按用户的字体大小偏好缩放。建议您使用 这个单位在指定字体大小时,因此它们将被调整为 屏幕密度和用户偏好。

              pt

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

              像素

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

              毫米

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

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

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

              【讨论】:

              • 另外:这个答案的附加价值是什么?其他答案中似乎没有任何未提及的内容。
              【解决方案10】:

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

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

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

              【讨论】:

                【解决方案11】:

                像素

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

                dp 或下降

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

                dp的使用:

                密度独立 - 当您的应用程序在不同密度的屏幕上显示时,它保留了用户界面元素的物理尺寸(从用户的角度来看),从而实现了“密度独立性”。 (ie) 图片在不同类型的屏幕上看起来应该是相同的尺寸(没有放大或缩小)。

                sp

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

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

                【讨论】:

                  【解决方案12】:

                  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。

                  【讨论】:

                    【解决方案13】:

                    你可以从下图中看到pxdp的区别,你也可以发现pxdp在不同的屏幕上不能保证相同的物理尺寸。

                    【讨论】:

                    • @EnesBattal,我认为因为 dp 不是一个精确的物理尺寸,它是一个近似值。引用 CapTech 的话:“dp - 这是一个与密度无关的单位,但是单个“dp”的物理尺寸仅在每个屏幕密度上大致相同。一英寸大约有 160 个“dp”。缩放因子,取决于在设备的密度桶上,用于将“dp”转换为 160 dpi 时的像素数。单个“dp”转换为的像素数取决于屏幕上的像素密度和设备所在的密度桶进入。”
                    • @RuchirBaronia,我认为 DP 或 DIP 仍然存在于 apk 中,因为 apk 尚不知道它将以哪种屏幕密度运行,因此仍应保持设备独立性。
                    【解决方案14】:

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

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

                    【讨论】:

                      【解决方案15】:

                      我只会使用 dp。

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

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

                      虽然“sp”字体的想法很好,但它是一个糟糕的想法。一切都坚持 dp。

                      【讨论】:

                      • 您知道应用于sp 的字体比例因子是一个因子,对吧?任何影响dp 的东西也会影响sp。也就是说,如果您的布局非常紧凑并且不适合较大的尺寸,则最好使用 dp 而不是 sp 指定字体大小 - 最好让文本小于用户想要的完全混乱的布局.但首先,您应该始终努力尊重用户的字体大小偏好——即使最大的设置也不是那么大。
                      【解决方案16】:

                      sp = 与比例无关的像素

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

                      dpi = 每英寸点数

                      我们应该避免使用sp

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

                      Android 支持不同的屏幕分辨率

                      • ldpi(低)~120 dpi
                      • mdpi(中)~160 dpi
                      • hdpi(高)~240 dpi
                      • xhdpi(超高)~320 dpi
                      • xxhdpi(超超高)~480 dpi
                      • xxxhdpi (extra-extra-extra-high) ~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
                      • "我们应该避免使用 sp" 为什么会这样?在处理字体大小时应该使用 sp,因为它考虑到了用户的首选文本大小,developer.android.com/training/multiscreen/screendensities.html
                      • 我已经回答了与布局透视相关的问题。请阅读您提供的链接“因此在定义文本大小时应使用此测量单位(但绝不用于布局大小)。”
                      • 问题是“Android 中 px、dp、dip 和 sp 的区别?”你的回答说“我们应该避免使用 sp”。任何地方都没有提到“布局透视图”。
                      • 是的.. dp 和 dip 是一样的...可以互换使用...我的回答能解决您的问题吗?
                      【解决方案17】:

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

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

                      private static final float LARGE_FONT_SCALE = 1.3f;
                      

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

                      【讨论】:

                        【解决方案18】:

                        dpi -

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

                        px - 像素

                        • 用于映射屏幕像素

                        pt - 点

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

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

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

                        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  
                        

                        【讨论】:

                        • 根据文档编译器接受“dip”和“dp”,尽管“dp”与“sp”更一致。
                        【解决方案19】:

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

                        sp = 与比例无关的像素

                        dp = 与密度无关的像素

                        dpi = 像素密度

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

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

                        您也可以将 sp 用于布局边界,它会起作用 :) 没有标准的应用程序使用 sp 来表示整个文本

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

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

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

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

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

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

                        【讨论】:

                          【解决方案20】:
                          Android 中的

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

                          • dp: 密度无关像素,因屏幕密度而异。在 160 dpi 屏幕中,1 dp = 1 像素。除字体大小外,始终使用 dp。
                          • 倾角:倾角 == dp。在早期的 Android 版本中使用 dip,后来改为 dp。
                          • sp: Scale Independent Pixel,根据用户的字体大小偏好进行缩放。字体应使用 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

                          将占用 150 像素 X 150 像素的图像,

                          • 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/

                          【讨论】:

                            【解决方案21】:

                            这是 Android 使用的公式:

                            px = dp * (dpi / 160)

                            其中 dpi 是以下屏幕密度之一。对于所有可能的密度列表go here

                            它定义了“DENSITY_*”常量。

                            • ldpi(低)~120dpi
                            • mdpi(中)~160dpi
                            • hdpi(高)~240dpi
                            • xhdpi(超高)~320dpi
                            • xxhdpi (extra-extra-high) ~480dpi
                            • xxxhdpi (extra-extra-extra-high) ~640dpi

                            取自here

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

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

                            px = 60 * (240 / 160)
                            

                            【讨论】:

                              【解决方案22】:
                              • px - 1 个像素,与 CSS、JavaScript 等中使用的相同。
                              • sp - 与比例无关的像素
                              • dip - 与密度无关的像素

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

                              【讨论】:

                              • 在 Android 中,“px”是指屏幕上物理像素的大小。在 CSS 中,1 px = 1/96 英寸。不是一回事。
                              【解决方案23】:

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

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

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

                              JMSTUDIO Blog:- Decide Android App Screen Size

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

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

                              为了方便计算,我们可以按照 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 的定义,1pd 等于 160 dpi 设备 (mdpi) 下的 1px。 所以我们想为 xlarge Android 设备设计一个 Android 应用程序 mdpi 密度,我们可以将我们的 UI 大小(以像素为单位)定义为 960 像素宽 高度为 720 像素;遵循同样的映射规则,我们可以得到 遵循 Android 应用屏幕尺寸 UI 设计指南:

                              添加:如果您也对“灵活”的 UI 感兴趣,请查看此库:An Android SDK that provides a new size unit - sdp (scalable dp). This size unit scales with the screen size(此处的答案中也提到过,关于 SDP 库)

                              ADDED2 Google 终于明白 iOS Storeboard UI 概念的用处了,这里是 ConstraintLayout for Android world:Build a Responsive UI with ConstraintLayout

                              【讨论】:

                                【解决方案24】:

                                1) dp: (density independent pixels)

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


                                2) sp: (scale independent pixels)

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


                                3) px: (pixels)

                                屏幕上的实际像素或点。


                                更多详情您可以访问

                                Android Developer Guide > Dimension
                                Android Developer Guide > Screens

                                【讨论】:

                                  【解决方案25】:

                                  屏幕尺寸在 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 单位。 dp 是 一个与密度无关的像素,对应于 像素为 160 dpisp 是相同的基本单位,但由 用户喜欢的文本大小(它是一个与比例无关的像素),所以你 定义文本大小时应使用此度量单位

                                  【讨论】:

                                    【解决方案26】:

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

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

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

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

                                    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,谷歌

                                    【讨论】:

                                      【解决方案27】:

                                      像素密度

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

                                      计算像素密度

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

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

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

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

                                      密度独立

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

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

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

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

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

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

                                      【讨论】:

                                        【解决方案28】:

                                        在回答这个问题之前,让我先减少单位数量。所以你去吧:dp 或 dip 都是相同的,并且被称为 与密度无关的像素

                                        1. px - 代表像素。像素是屏幕上的一个点。通常在移动行业,它以 PPI(每英寸像素数)来衡量。屏幕分辨率与PPI成正比,每英寸像素数越大,屏幕分辨率越高。

                                        例如,如果您绘制尺寸为 200 px * 200 px 的图像,那么它在高分辨率设备上的外观与在低分辨率设备上的外观必须不同。分辨率设备。原因是 200 像素,低分辨率手机上的图像看起来会比高分辨率设备上的大。

                                        下图显示了同一图像在不同手机上的分辨率-

                                        • 高屏幕分辨率手机

                                        • 屏幕分辨率低的手机

                                        2。 dip 或 dp - 基于屏幕物理密度的抽象单位。这些单位是相对于 160 dpi 屏幕的,因此 1 dp 是 160 dpi 屏幕上的一个像素。 dp与像素的比例会随着屏幕密度而变化,但不一定成正比。 “密度无关”是指UI元素在不同密度屏幕上的统一显示。

                                        • 图像显示 80px(左侧图像)80 dp(右侧图像)。结帐差异。

                                        dp 等于屏幕上的一个物理像素,密度为160。计算dp:

                                        dp = (像素宽度 * 160) / 屏幕密度

                                        3. sp - 代表可缩放像素。一般 sp 用于 UI 上的文本,sp 保留字体设置。例如,如果用户选择了大于 30 sp 的字体,它将根据用户偏好自动缩放以显示较大。

                                        【讨论】:

                                        • 你混淆了Phone with low screen resolution到相应的图片
                                        【解决方案29】:

                                        sp:缩放独立像素

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

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

                                        【讨论】:

                                          【解决方案30】:

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

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

                                          Scale-independent Pixels(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-

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

                                          【讨论】:

                                            猜你喜欢
                                            • 2012-09-08
                                            • 2013-05-18
                                            • 2015-06-22
                                            • 2014-02-26
                                            • 2014-08-21
                                            • 1970-01-01
                                            • 2011-01-24
                                            • 2014-10-09
                                            • 2016-12-20
                                            相关资源
                                            最近更新 更多