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




15 Answers

来自Android开发者文档

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


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

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

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

  5. dpdip
    密度非依赖像素 - 基于屏幕物理密度的抽象单元。 这些单位相对于160 dpi的屏幕,因此一个dp是160 dpi屏幕上的一个像素。 dp与像素的比率将随着屏幕密度而变化,但不一定是成正比的。 注意:编译器同时接受“dip”和“dp”,但“dp”更符合“sp”。

  6. SP
    与比例无关的像素 - 这与dp单位类似,但它也会根据用户的字体大小首选项进行缩放。 建议您在指定字体大小时使用此单位,以便根据屏幕密度和用户偏好调整它们。

了解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     | Density     | Same Physical Size | 
|         |             | Physical Inch | Independent | 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     | ~160          | Yes         | No                 | 
|         | Independent |               |             |                    | 
|         | Pixels      |               |             |                    | 
+---------+-------------+---------------+-------------+--------------------+
| sp      | Scale       | ~160          | Yes         | No                 | 
|         | Independent |               |             |                    | 
|         | Pixels      |               |             |                    | 
+---------+-------------+---------------+-------------+--------------------+

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

要在真实设备上计算尺寸,可以使用this应用。

android宽度dp dp适配

android测量单位有什么区别?

  • PX
  • DP
  • SP



我将详细说明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图像
  • 150 * 150 px的hdpi图像
  • xhdpi的200 * 200 px图像



此外,您应该清楚地了解以下概念:

屏幕尺寸:

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

屏幕密度:

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

取向:

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

解析度:

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

密度无关像素(dp):

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

参考: Android开发者网站




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




来源1

来源2

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

这些是以XML定义的维度值。 使用数字后跟度量单位指定维度。 例如:10px,2in,5sp。 Android支持以下度量单位:

DP

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

SP

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

PT

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

PX

像素 - 对应屏幕上的实际像素。 建议不要使用此计量单位,因为实际表示可能因设备而异; 每个设备可以具有每英寸不同数量的像素,并且可以在屏幕上具有更多或更少的总像素。

毫米

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

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

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




PX

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

dp或dip

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

使用dp:

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

SP

与比例无关的像素 - 这与dp单位类似,但它也可以通过用户的字体大小首选项进行缩放。

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




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




我只会使用dp。

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

此外,如果您在160 dpi平板电脑上使用sp-font应用程序,您会发现所有内容都会扩展...但是您的字体相比之下看起来很小。 这不好看。

虽然“sp”字体的想法有一颗好心,但这是一个糟糕的主意。 坚持使用dp。




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

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

private static final float LARGE_FONT_SCALE = 1.3f;

这当然可能是供应商依赖的,因为它位于packages/apps/Settings




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

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




Android 屏幕尺寸分为smallmediumlargeextra largedouble-extratriple-extra 。 屏幕密度是屏幕区域(如英寸)内的像素数量。 通常,它以每英寸点数(dpi)来测量。 屏幕密度分为低,中,高和超高。 分辨率是屏幕中的总像素数。

  • dp:密度独立像素,它根据屏幕密度而变化。 在160 dpi屏幕中,1 dp = 1像素。 除字体大小外,请始终使用dp。
  • dip: dip == dp。 在早期的Android版本中,使用了dip,后来改为dp。
  • sp: Scale Independent Pixel,根据用户的字体大小首选项进行缩放。 字体应该使用sp。
  • px:我们通常的标准像素,映射到屏幕像素。
  • in:英寸,相对于物理屏幕尺寸。
  • 毫米:毫米,相对于物理屏幕尺寸。
  • pt: 1/72英寸,相对于物理屏幕尺寸。

单位之间转换公式

 px = dp * (dpi / 160)

dp到设备中的px

以下示例有助于更好地理解。 基于桶大小120(ldpi),160(mdpi),240(hdpi),320(xhdpi),480(xxhdpi)和640(xxxhdpi)进行缩放。 对于ldpi,谷歌建议的设计比例为3:4:6:8:12:mdpi:hdpi:xhdpi:xxhdpi

150px X 150px图像将占用,

  • mdpi中150 dp X 150 dp的屏幕空间
  • hdpi中的100 dp X 100 dp屏幕空间
  • xhdpi中的75 dp X 75 dp屏幕空间

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




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

不幸的是,Android的UI概念并不差,但缺乏iOS Storyboard功能。在Android中设计灵活的UI并不容易(最好)。

这篇文章帮助我了解Android中的操作,以便为不同的屏幕尺寸制作布局:

JMSTUDIO博客: - 决定Android App屏幕尺寸

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

要为不同的屏幕尺寸设计应用程序UI,我们的初始设计必须满足每个屏幕尺寸所需的最小空间。Android为每种通用屏幕类型定义最小大小(以dp为单位)。这是Android屏幕尺寸指南。当我们以dp获得屏幕尺寸时,我们还不足以设计Android应用UI。对于每个屏幕尺寸,我们需要为每个密度准备图形和位图图像。这是Android屏幕密度指南。

为了便于计算,我们可以遵循四个广义密度之间的3:4:6:8缩放比例。如果我们为ldpi设备创建一个36×36像素的图片,其余密度图片大小为mdpi为48×48,hdpi为72×72,xhdpi为96×96。

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

由于密度独立单元dp,许多设计人员在photoshop或其他基于像素的图形设计工具中设计Android应用UI时遇到问题。设计师不知道如何将dp映射到像素。Google也没有为他们提供明确的Android UI设计指南,尽管他们提供了dp和像素转换的基本公式。

作为Android的定义,1pd等于160ppi设备(mdpi)下的1px。因此,我们希望为具有mdpi密度的xlarge Android设备设计Android应用程序,我们可以将像素大小定义为像素宽度为960像素,高度为720像素; 遵循相同的映射规则,我们可以获得以下Android App屏幕尺寸UI设计指南:

增加:如果您对“灵活”UI感兴趣,请查看此库:提供新大小单元的Android SDK - sdp(可扩展的dp)。这个尺寸单位随屏幕尺寸而变化(这也在答案中提到,关于SDP图书馆)

ADDED2 Google终于理解了iOS Storeboard UI概念的实用性,适用ConstraintLayout于Android世界:使用ConstraintLayout构建响应式UI




1) dp: (density independent pixels)

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


2) sp: (scale independent pixels)

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


3) px: (pixels)

屏幕上的实际像素或点。


有关详细信息,请访问

Android开发人员指南> Dimension
Android开发人员指南>屏幕




sp:与比例无关的像素

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

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




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

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

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

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

  • 具有高屏幕分辨率的手机

  • 手机屏幕分辨率低

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

  • 显示80px(左侧图像)80dp(右侧图像)的图像。结帐区别。

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

dp =(宽度,以像素为单位* 160)/屏幕密度

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




Related