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

6353

px, dip, dp, 和sp这些单位有什么不同?


81
这是关于 Android 中 px、dip、dp 和 sp 的有用区别,详见:http://developer.android.com/guide/topics/resources/more-resources.html#Dimension - NagarjunaReddy
28
在我看来,这个巧妙的转换器展示了最好的效果。它还非常有用,可以用于从Photoshop导出精灵或为物理尺寸设计布局。 - Paul Lammertsma
如何以编程方式在pxdpsp之间进行转换 - Suragch
3
材料设计与像素密度 https://material.io/design/layout/understanding-layout.html#pixel-density - Shomu
@PaulLammertsma 转换器的 pt 是错误的吗?据我理解,pt 与 dpi 有关,但它总是 72? - Amos
显示剩余2条评论
33个回答

43
我发现了一篇关于为不同屏幕分辨率设计Android应用程序界面的好文章,我想在这里留下它,供那些在这个领域搜索的人使用。是的,我知道在Google文档中有所描述(并且在上面的帖子中提到),我读了那篇文章,但对我来说并不好(是的,我可能太蠢了)。我不清楚如何设计能够处理不同屏幕大小的布局。当我需要为不同屏幕实现“灵活”的UI布局时,我讨厌DP概念等等。(嘿,iOS开发者 - 是的,你们说得对,这是一个Storyboard概念)。
Android没有坏的UI概念,但不幸的是缺乏iOS Storyboard的功能。在Android中设计灵活的UI并不容易(充其量)。
下面是一篇帮助我理解如何在Android中制作适合不同屏幕大小的布局的文章: JMSTUDIO博客:-决定Android应用程序屏幕大小 如何为不同屏幕尺寸设计Android应用程序的UI
为了为不同的屏幕尺寸设计应用程序UI,我们的初始设计必须满足每个屏幕尺寸的最小所需空间。Android为每种通用屏幕类型定义了最小大小(以dp为单位)。以下是Android屏幕尺寸指南。 Minimum Screen Size for Android in dp 当我们获得dp的屏幕尺寸时,仅此还不足以为我们设计Android应用程序UI。对于每个屏幕尺寸,我们需要为每个密度准备图形和位图图像。以下是Android屏幕密度指南。 Android Density Guideline (dpi) 为了方便计算,我们可以在四个通用密度之间遵循3:4:6:8的缩放比例。如果我们为ldpi设备创建一个36×36像素的图片,则其余密度的图片尺寸将分别为48×48(mdpi),72×72(hdpi)和96×96(xhdpi)。
如何在Photoshop中设计Android应用程序UI
许多设计师在Photoshop或其他基于像素的图形设计工具中设计Android应用程序UI时会遇到问题,因为存在密度无关单位dp。设计师不知道如何将dp映射到像素。Google也没有为他们提供清晰的Android UI设计指南,尽管他们提供了一个基本的dp和像素转换公式。
根据Android的定义,1dp等于160dpi设备(mdpi)下的1px。因此,如果我们要为具有mdpi密度的xlarge Android设备设计Android应用程序,我们可以将UI大小以像素为960像素宽和720像素高进行定义;按照相同的映射规则,我们可以得到以下Android应用程序屏幕尺寸UI设计指南: Android App Screen Size in Pixel Guideline ADDED: 如果您也对“灵活”的用户界面感兴趣,可以看看这个库:一个提供新的尺寸单位-sdp(可缩放dp)的Android SDK。该尺寸单位随着屏幕大小而缩放(这也在这里的一个答案中提到了,关于SDP库)。 ADDED2 Google 终于理解了 iOS Storeboard UI 概念的有用性,推出了适用于 Android 的 ConstraintLayout使用 ConstraintLayout 构建响应式用户界面

34

1) dp:(密度无关像素)

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


2) sp:(比例缩放像素)

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


3) px:(像素)

屏幕上实际的像素或点。


欲了解更多详细信息,请访问:

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


31
在Android中,屏幕尺寸被分为ldpimdpihdpixhdpixxhdpixxxhdpi几类。 屏幕密度是指在屏幕上每个单位面积内(如英寸)的像素数量。通常是以每英寸点数(dpi)来衡量。 PX(像素):
  • px是我们通常所用的标准像素,它映射到屏幕像素上。 px用于表示绝对像素。如果你想给出宽度或高度的绝对像素值,请不要使用它。

DP / DIP(密度无关像素):
  • dip == dp。Android早期版本中使用dip,后来改为了dp。这是px的替代品。

  • 通常我们不使用px,因为它是绝对值。如果你使用px设置宽度或高度,并且该应用程序正在下载到不同尺寸的设备中,那么该视图将不会根据屏幕原始大小进行拉伸。

  • 强烈建议使用dp代替px。如果要根据屏幕大小动态调整宽度和高度,请使用dp

  • 如果给出dp / dip,Android会自动基于160像素大小的屏幕计算像素大小。

SP(比例无关像素):
  • 基于用户字体大小偏好进行缩放。字体应使用sp

  • 提及适合各种屏幕尺寸的字体大小时,请使用 sp。这与 dp 相似。尤其在需要根据屏幕尺寸动态增大和缩小字体大小时,请使用 sp

  • Android 文档说明:

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


    25

    像素密度

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

    计算像素密度

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

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

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

    屏幕密度 = 屏幕宽度(或高度)中的像素数 / 屏幕宽度(或高度)英寸数

    高密度 vs 低密度显示器

    密度独立性

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

    计算像素密度

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

    密度无关性是指在不同屏幕密度下对UI元素进行统一显示。

    密度无关像素,简称dp(发音为“dips”),是一种灵活的单位,其尺寸能够在任何屏幕上保持一致。 Material UI使用密度无关像素来在不同密度的屏幕上一致地显示元素。

    1. 密度较低的屏幕通过密度无关性进行显示
    2. 密度较高的屏幕通过密度无关性进行显示

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


    24
    一个手机屏幕由成千上万个小点组成,称为像素(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)是显示屏上清晰度(即发光点密度)的一种度量。由于相同数量的像素被分布在不同的空间上,因此给定图片分辨率的每英寸点数将根据整体屏幕尺寸而异。
    使用密度无关像素帮助我们处理这样一种情况:您有两个具有相同像素分辨率但空间不同的设备。假设平板电脑和手机的像素分辨率分别为1280x800像素(160 dpi)和800x1280像素(320 dpi)。
    现在,因为平板电脑处于基线密度(160 dpi),它的物理和密度无关像素大小相同,为1280x800。另一方面,手机具有更高的像素密度,因此其密度无关像素只有物理像素的一半。因此,手机有400x640密度无关像素。因此,使用密度无关像素使得更容易想象平板电脑比手机拥有更多的空间。
    同样,如果你有两个屏幕大小相似但像素密度不同的设备,比如一个是800x1280像素(320 dpi),另一个是400x640像素(160 dpi),我们不需要为这两个设备定义完全不同的布局,因为我们可以用密度无关像素来衡量资产,这对于这两个设备来说是相同的。
    800x1280像素(320dpi)=400x640密度无关像素(dp)
    400x640像素(160dpi)=400x640密度无关像素(dp)
    对于字体大小,可缩放独立像素(sp)是首选单位。为了辅助功能,Android允许用户自定义设备的字体大小。阅读困难的用户可以增加设备的字体大小。您通常可以在手机或平板电脑的显示设置中找到此选项,在字体大小下方。它通常也可以通过辅助功能设置获得。
    使用可缩放独立像素时,当设备的字体大小为正常或100%时,16 sp与16 dp完全相同。但是当设备的字体大小变大时,例如125%时,16 sp将转换为20 dp,即1.25倍的16。
    如果您使用dp作为字体大小的单位,那么该文本将具有特定的物理大小,无论用户是否自定义了设备的字体大小。使用sp单位将为视力受损的人提供更好的体验。
    参考资料:Udacity, Google

    20

    sp: 可缩放独立像素

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

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


    18

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

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

    缩放无关像素(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/


    16

    我想提供一种易于理解dp的方法。实际上,我认为dp是最容易理解的。 dp只是一个物理长度单位。它与mminch具有相同的维度。我们写50dp60dp比写50/160英寸60/160英寸方便,因为一个dp无论屏幕大小或分辨率如何都是1/160英寸

    唯一的问题是,某些屏幕的 android dpi 不精确。例如,被分类为 160dpi 的屏幕可能实际上有 170dpi。因此,dp的计算结果是模糊的。应该大约相当于1/160英寸


    13

    SDP - 是一种可扩展的尺寸单位,它基本上不是一个单位,而是针对不同屏幕尺寸的维度资源。

    尝试使用 Intuit 公司的sdp库。它非常方便地解决了尺寸单位问题,可以快速支持多屏幕

    用法

    android:paddingBottom="@dimen/_15sdp" 代表正数,android:layout_marginTop="@dimen/_minus10sdp" 代表负数。

    sdp在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来控制文本大小,但我更喜欢使用ssp来控制文本大小。
    要了解更多详情,请查看该库的GitHub页面

    8
    像素密度和dp的比率会随着屏幕密度而变化,但不一定成正比例。 注意:编译器接受“dip”和“dp”两种单位,但使用“dp”更加一致。 缩放无关像素 - 这类似于dp单位,但还会根据用户的字体大小偏好进行缩放。

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