# 【我的安卓第一课】Android 单位系统

**URL:** <https://www.shiqidu.com/t/topic/877>\
**Category:** 开发调优\
**Tags:** Android\
**Created:** [2025 年11 月 8 日 16:51 UTC](https://www.shiqidu.com/t/topic/877 "2025-11-08T16:51:37Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![shiqidu\_editor](https://www.shiqidu.com/user_avatar/www.shiqidu.com/shiqidu_editor/32/528_2.png) [@shiqidu\_editor](https://www.shiqidu.com/u/shiqidu_editor)\
发布日期： [2025 年11 月 8 日 16:51 UTC](https://www.shiqidu.com/t/topic/877/1 "2025-11-08T16:51:37Z")

</div>

## 1. 引言

Android 设备作为一种特殊的嵌入式设备， **其经常需要接入屏幕进行画面渲染** ，然后由于 **屏幕的多样性** ，并且需要 **渲染的内容也多种多样** ，Android 为此设计了许多单位，来更好的处理各种各样的`View`渲染

## 2. 单位

 ![](https://discourse.shiqidu.com/uploads/default/original/1X/f0b39f35acc64ccdd924948fcc4150b64bfa287b.jpeg)

### 2.1. dp (Density-independent Pixels)

- **定义** ： **dp 是与屏幕密度无关** 的抽象单位，也称 `dip` 。它被设计用来 **让 UI 元素在不同密度的屏幕上看起来大小一致。**
- **用途** ：主要用于布局文件中定义宽度、高度、边距等尺寸属性。

出现这个单位也很好想到，比如同样是1080P，有的可以达到26寸(比如PC显示屏)，有的却只有7寸(比如手机屏)。为了保证视觉效果一致，才出现的此单位。

> 不要和 `dpi`(Dots Per Inch，每英寸点数)混淆

### 2.2. in (Inches)

- **定义** ：英寸，基于 **屏幕物理尺寸** 的单位。
- **用途** ：很少使用，因为现代移动设备的尺寸变化范围大，难以提供一致的用户体验。

该单位基本用于衡量屏幕大小，很少用于编程 (英制单位的换算也很令人难蚌)

### 2.3. mm (Millimeters)

- **定义** ：毫米，同样 **基于屏幕物理尺寸** 。
- **用途** ：类似于英寸，不常用。

和英寸一样，不过变成了公制单位

### 2.4. pt (Points)

- **定义** ：点，1/72英寸。
- **用途** ：也不常用，通常用于特定的设计需求。

英寸的1/72，缩小版英寸(误

### 2.5. px (Pixels)

- **定义** ：物理像素点，直接对应屏幕上的实际像素数。
- **用途** ：不建议在大多数情况下使用px，因为它会导致在不同密度的设备上显示效果差异很大。

以所占像素数为单位，算是见的最多的单位之一，平时说的 `1920x1080`，`2560x1440` 指的就是长和宽的像素数。一般用于衡量分辨率。但

### 2.6. sp (Scale-independent Pixels)

- **定义** ：sp 是 **一种特殊的 dp** 单位，但它还 **考虑了用户的字体大小偏好** 设置。这意味着使用sp作为字体大小单位可以让文本自动适应用户对字体大小的调整。**(被SP控制的字体，可以通过系统整体控制字体大小时)**
- **用途** ：主要用于TextView等控件中的字体大小设定。

sp 是一种专用于字体的 dp单位。

### 2.7. 总结

**一般来说，我们都是使用`dp`，`sp`，某些特殊需求可能使用`px`。其余的使用的就很稀少了。**

> 屏幕密度为160时，1dp=1sp=1px

## 3. 相互转换

可以通过获取`density`进行 dp 与 px 的互换

```java
public int dp2px(int dp, Context context) {
    float density = context.getResources().getDisplayMetrics().density;
    return Math.round(dp * density);
}

public int px2dp(int px, Context context) {
    float density = context.getResources().getDisplayMetrics().density;
    return Math.round(px / density);
}

```

可以通过获取`scaledDensity`进行 sp 与 px 的互换

```java
public int sp2px(int sp, Context context) {
    float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
    return Math.round(sp * scaledDensity);
}

public int px2sp(int px, Context context) {
    float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
    return Math.round(px / scaledDensity);
}

```

## 4. 附录

在 Android 中，可根据像素密度触发自动加载不同的资源，如下表所示，100 dp 在不同

| 设备 DPI | 计算公式 | 实际像素宽度 |
| --- | --- | --- |
| mdpi (160) | 100 × (160/160) | 100px |
| hdpi (240) | 100 × (240/160) | 150px |
| xhdpi (320) | 100 × (320/160) | 200px |
| xxhdpi(480) | 100 × (480/160) | 300px |

比如，一个 100 px的按钮 设备 A：手机（xxhdpi 屏幕，480 dpi）

- 屏幕密度高 → 每英寸有更多像素。
- 使用 `100px` 宽度的按钮 → 实际占据空间较小。
- 结果：按钮看起来 **很小** ，用户难以点击，应该占据300px

设备 B：平板（mdpi 屏幕，160 dpi）

- 屏幕密度低 → 每英寸像素较少。
- 同样使用 `100px` 宽度的按钮 → 占据的空间较大。
- 结果：按钮看起来 **很大** ，破坏整体界面美观。

> 不过有时候只关注单位也是不够的， **在不同的设备上，往往也需要设计不同的布局**

> 本文转自 [https://juejin.cn/post/7527865199861743643](https://juejin.cn/post/7527865199861743643)，如有侵权，请联系删除。
