dp转px android “px”,“dip”,“dp”和“sp”之间有什么区别?




15 Answers

几乎所有关于此以及如何获得对具有不同尺寸和密度的多个屏幕的最佳支持在这里都有很好的记录:

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

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

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

解析度
屏幕上的物理像素总数。 添加对多个屏幕的支持时,应用程序无法直接使用分辨率; 应用程序应仅关注屏幕尺寸和密度,如通用尺寸和密度组所指定。

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

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

android宽度dp

android测量单位有什么区别?

  • PX
  • DP
  • SP



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

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

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

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

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

sp -Scale-independent 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



dpdip 。 用于所有事情(边距,填充等)。

仅对{text-size}使用sp

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

查看不同屏幕尺寸上pxdpsp之间的差异。

来源: Android编程:大书呆子牧场指南




定义

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

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

Android为几种密度提供别名

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

dipdp密度依赖的像素 ,即它们根据物理密度对应于更多或更少的像素。

  • mdpi上1dp = 1px

spsip是一个与比例无关的像素 。 在“设置” >“ 辅助功能”中打开“ 大文本”选项时,它们会缩放

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

用什么?

使用sp表示文本大小。

dp用于其他一切。




基本上px应用的唯一时间是一个px,如果你想在屏幕上只有一个像素,就像分频器一样:

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

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




在哪里使用px和dp之间的关系和关系?

密度无关像素(dp)

在定义UI布局时应使用的虚拟像素单元,以与密度无关的方式表达布局尺寸或位置。 如上所述,与密度无关的像素相当于160dpi屏幕上的一个物理像素,这是系统为“中”密度屏幕假定的基线密度。 在运行时,系统根据使用的屏幕的实际密度,根据需要透明地处理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

如上所述。 尽量避免使用布局文件。 但在某些情况下,需要px。 例如,ListView分隔线。 对于所有跨屏幕分辨率,px更适合为一个像素线作为分频器。

SP

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




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

您可以在其位置使用dpdip




sp =与尺度无关的像素

dp = dip =密度独立像素

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像素。

其他密度相同......

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

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



dpi -

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

px - 像素

  • 用于映射屏幕像素

pt - 分

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

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

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

sp - scale-independent pixel。

  • 根据用户的字体大小首选项。
  • 字体应该是'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  



这是Android使用的公式:

px = dp *(dpi / 160)

其中dpi是以下屏幕密度之一。 有关所有可能密度的列表, 请转到此处

它定义了“DENSITY_ *”常量。

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

这里开始

如果你知道你的屏幕dpi,这将在px和dp之间进行翻译时解决很多困惑。

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

px = 60 * (240 / 160)



请阅读社区维基的答案。下面提到的是除上述答案之外还需要考虑的一些信息。

sp =与尺度无关的像素

dp =密度独立像素

dpi =密度像素

我已经完成了上述答案......没有找到完全正确的答案。sp表示文本大小,dp表示布局边界 - 标准。但是,如果在大多数设备中不小心使用,文本大小的sp将破坏布局

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

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

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

  • 不要在工具栏中使用sp作为文本(可以使用android dimensions available或dp)
  • 不要在小有界按钮,非常小的文本等中使用sp作为文本

有些人在他们的手机中使用巨大的FONT以提高可读性,给他们提供小的硬编码文本将成为UX问题。在必要时将sp放入文本,但请确保它不会破坏布局。

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




屏幕尺寸在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是相同的基本单位,但是按用户首选的文本大小(它是与比例无关的像素)进行缩放,因此在定义文本大小时应使用此测量单位




移动电话的屏幕由数千个称为像素(px)的小点组成。像素是制作图像的最小元素。制作图片或措辞的像素数量越多,它就越清晰,使智能手机屏幕更容易阅读。

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

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

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

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×800像素(160dpi)和800×1280像素(320dpi)。

现在,由于平板电脑处于基线密度(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,谷歌




SDP - 可扩展的大小单元 - 基本上它不是一个单元,而是用于不同屏幕尺寸的尺寸资源。

试试Intuit 的sdp库。解决单元问题非常方便,您可以快速支持多个屏幕

用法

android:paddingBottom="@dimen/_15sdp"对于正面和android:layout_marginTop="@dimen/_minus10sdp"负面的sdp 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页面




我想提供一种简单易懂的方法dp。事实上,我认为这dp是最容易理解的。dp只是一个物理长度单位。它和mmor的尺寸相同inch。这对我们来说只是方便50dp60dp而不是50/160 inch或者60/160 inch,因为一个dp1/160 inch屏幕大小或分辨率。

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




Related