Screen Density:本质,Android 中的像素密度

作者: IT Sectr 发布日期: 2026-02-25 阅读时间: 6 分钟

讲解 Screen Density(Density Buckets)在 Android 中的本质 — 根据像素密度对屏幕进行分类:mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi。Screen Density 决定了一英寸屏幕中可以容纳多少个物理像素,并直接影响图像和界面在不同设备上的显示方式。根据 Google Android Compatibility Definition (2025),Android 支持 6 个主要的 Density Buckets 以及最多 8 个用于折叠设备的额外 buckets。

要点

  • Screen Density — 每英寸的物理像素数 (PPI)。Android 将屏幕分组为 Density Buckets:mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi。
  • 基本 bucket — mdpi (160 dpi)。所有其他 bucket 都相对于它计算:hdpi = 1.5×、xhdpi = 2×、xxhdpi = 3×、xxxhdpi = 4×。
  • 不同密度的资源存储在限定的 res/drawable-{density} 文件夹中。
  • 根据 Android Studio (2025),现代设备上最常见的密度是 xxhdpi (420+ dpi, 3×)。
  • Screen Density 与屏幕分辨率无关 — 两个分辨率相同的设备可能具有不同的密度。

什么是 Screen Density?

Screen Density(屏幕密度)— 每英寸屏幕的物理像素数(ppi — pixels per inch,或 dpi — dots per inch)。Android 使用 Density Buckets 的概念 — 将具有相似密度的屏幕分组,对它们应用相同的缩放因子。与分辨率(宽度和高度的像素数)不同,密度决定了像素在屏幕上的物理大小。根据 Google Pixel Team (2025),现代旗舰机的密度为 450-550 ppi,对应于 xxhdpi-xxxhdpi buckets。

Density Buckets 的历史与演变

Density Buckets 系统出现在 Android 1.6 Donut (2009) 中,首批设备为 160 dpi (mdpi)。随着屏幕分辨率的提高,新增了更多 buckets:hdpi (Android 1.6)、xhdpi (Android 2.3)、xxhdpi (Android 4.1)、xxxhdpi (Android 4.4)。每个新 bucket 相对于前一个反映了 1.5 倍或 2 倍的密度增长。根据 Android Open Source Project (2025),目前 96% 的活跃 Android 设备的密度在 hdpi 到 xxxhdpi 之间。

Density Buckets:mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi

Density Buckets — 由 Google 定义的用于分组 Android 屏幕的密度范围。基本 bucket — mdpi (160 dpi)。缩放因子 (scale factor) 表示特定 bucket 的资源比 mdpi 大多少倍。例如,xhdpi (2×) 意味着图像的宽度和高度必须是其 mdpi 版本的 2 倍。根据 Android Studio Resource Manager (2025),xxhdpi 是活跃设备中最常见的 bucket(占市场的 38%),其次是 xhdpi (28%)。

BucketDPI 范围缩放因子示例设备市场份额 (2025)
ldpi120 dpi0.75×旧的廉价设备低于 1%
mdpi120-160 dpiHTC Dream (G1)、7 英寸平板电脑3%
hdpi160-240 dpi1.5×Samsung Galaxy S2、Nexus 412%
xhdpi240-320 dpiGoogle Nexus 5、Moto G28%
xxhdpi320-480 dpiSamsung Galaxy S8、Pixel 338%
xxxhdpi480-640 dpiSamsung Galaxy S24 Ultra、Pixel 9 Pro18%

像素密度 vs 屏幕分辨率:有什么区别

屏幕分辨率 — 宽度和高度的像素总数(例如 1080×2400)。屏幕密度 — 每英寸的像素数。两个分辨率相同的设备,如果屏幕的物理尺寸不同,则可能具有不同的密度。例如,一款 6 英寸分辨率为 1080×2400 的手机密度约为 440 dpi (xxhdpi),而一款 5 英寸相同分辨率的手机密度约为 530 dpi (xxxhdpi)。这是关键区别:界面必须适应密度,而不是分辨率,否则元素在高密度设备上会显得太小。

Android 中的密度资源限定符

Android 在 res 文件夹名称中使用 qualifiers 来加载特定屏幕密度的资源:drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi。应用启动时,Android 从与设备密度最匹配的文件夹中选择资源。如果没有精确匹配,系统会选择最接近的 bucket 或从较低密度缩放资源。根据 Android Docs (2025),对于矢量 (VectorDrawable) 不需要密度限定符 — 它们会自动缩放。

XML

/res/
    drawable-mdpi/
        icon_app.png  (48x48 px)
    drawable-hdpi/
        icon_app.png  (72x72 px)
    drawable-xhdpi/
        icon_app.png  (96x96 px)
    drawable-xxhdpi/
        icon_app.png  (144x144 px)
    drawable-xxxhdpi/
        icon_app.png  (192x192 px)

在这种结构中,每个文件夹都包含相同的图标,但物理像素尺寸不同。mdpi 的基本尺寸 48×48 像素乘以每个 bucket 的缩放因子。Android 会根据设备的 DisplayMetrics.density 自动选择所需文件。对于 VectorDrawable(XML 格式),drawable/ 中只需一个文件 — 系统会对其进行缩放而不会损失质量。

每种密度的像素计算

尺寸计算 每种密度的图像都基于一个简单的公式:mdpi 中的尺寸 × scale factor。如果图标在 mdpi 中为 48×48 px,则对于 hdpi 为 72×72 px (48 × 1.5)、xhdpi — 96×96 px (48 × 2)、xxhdpi — 144×144 px (48 × 3)、xxxhdpi — 192×192 px (48 × 4)。根据 Material Design Guidelines (2025),此公式适用于所有栅格资源:图标、背景、图像和 9-patch。

Bucket缩放因子mdpi 尺寸 (px)Bucket 中的尺寸 (px)
mdpi48×4848×48
hdpi1.5×48×4872×72
xhdpi48×4896×96
xxhdpi48×48144×144
xxxhdpi48×48192×192

为所有密度准备资源的最佳实践

正确准备 Density Buckets 的资源包括五条关键规则。第一,对简单图标使用 VectorDrawable — 这消除了对五个副本的需求。第二,对于栅格图像,从设计工具中一次性导出所有密度(Android Studio Asset Studio 会自动生成)。第三,避免将图像放在没有限定符的 drawable/ 中 — 系统会以质量损失进行缩放。第四,在与主要设备密度不同的设备上进行测试 — 模拟器允许更改密度。第五,使用 WebP 代替 PNG — 根据 Google (2025),WebP 在相同质量下可减少 25-35% 的大小。

  • VectorDrawable — 图标和简单插画的首选格式。一个 XML 文件可替代 5 个 PNG。
  • Android Studio Asset Studio — 从 SVG 或 PNG 自动生成所有密度的资源。
  • 无损 WebP — 照片的最佳格式。比 PNG 小 30% 且不损失质量。
  • 9-patch — 用于可缩放背景。通过正确设置拉伸区域,一个文件可在所有密度下工作。
  • 自适应图标 — 适用于 API 26+ 的图标格式。允许为不同密度分别设置前景和背景。

常见问题

Android 中的 mdpi 是什么意思?

mdpi (medium-density pixel-independent) — Android 的基本 Density Bucket,密度为 160 dpi。所有其他 bucket 都相对于 mdpi 计算:hdpi — 1.5×、xhdpi — 2× 等等。mdpi 对应一个 density-independent pixel (dp) 对应一个物理像素。设计师在创建设计时正是以 mdpi 为基准。

如何了解 Android 设备的屏幕密度?

使用 DisplayMetrics:getResources().getDisplayMetrics().density 返回缩放因子(mdpi 为 1.0,xxhdpi 为 3.0)。要以编程方式确定 bucket,请调用 getResources().getConfiguration().densityDpi。Android Studio 中还有 Device Explorer,可显示已连接设备的 densityDpi。

是否必须为所有密度准备资源?

从技术上讲 — 是的,但会有质量损失。如果资源仅存在于 drawable-xxhdpi 中,在 mdpi 设备上会缩小 3 倍 — 图像会变得模糊。如果资源仅存在于 mdpi 中,在 xxhdpi 上会放大 — 会出现像素化。建议至少准备 xhdpi、xxhdpi 和 xxxhdpi — 这覆盖了 84% 的活跃设备 (2025)。对于 VectorDrawable,无需限定符的一个文件就足够了。

总结

  • Screen Density — 每英寸的物理像素数 (dpi/ppi)。Android 将屏幕分组为 Density Buckets:mdpi (1×)、hdpi (1.5×)、xhdpi (2×)、xxhdpi (3×)、xxxhdpi (4×)。
  • 基本 bucket mdpi = 160 dpi。其他 bucket 按 mdpi × scale factor 计算。
  • 不同密度的资源存储在限定的 res/drawable-{bucket} 文件夹中。
  • xxhdpi — 最常见的 bucket (38%),其次是 xhdpi (28%) 和 xxxhdpi (18%)。
  • VectorDrawable 替代 5 个栅格文件并可无质量损失地缩放。
  • 使用 WebP 代替 PNG 可节省 30% 的流量和存储空间。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读