讲解 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 — pixels per inch,或 dpi — dots per inch)。Android 使用 Density Buckets 的概念 — 将具有相似密度的屏幕分组,对它们应用相同的缩放因子。与分辨率(宽度和高度的像素数)不同,密度决定了像素在屏幕上的物理大小。根据 Google Pixel Team (2025),现代旗舰机的密度为 450-550 ppi,对应于 xxhdpi-xxxhdpi 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 — 由 Google 定义的用于分组 Android 屏幕的密度范围。基本 bucket — mdpi (160 dpi)。缩放因子 (scale factor) 表示特定 bucket 的资源比 mdpi 大多少倍。例如,xhdpi (2×) 意味着图像的宽度和高度必须是其 mdpi 版本的 2 倍。根据 Android Studio Resource Manager (2025),xxhdpi 是活跃设备中最常见的 bucket(占市场的 38%),其次是 xhdpi (28%)。
| Bucket | DPI 范围 | 缩放因子 | 示例设备 | 市场份额 (2025) |
|---|---|---|---|---|
| ldpi | 120 dpi | 0.75× | 旧的廉价设备 | 低于 1% |
| mdpi | 120-160 dpi | 1× | HTC Dream (G1)、7 英寸平板电脑 | 3% |
| hdpi | 160-240 dpi | 1.5× | Samsung Galaxy S2、Nexus 4 | 12% |
| xhdpi | 240-320 dpi | 2× | Google Nexus 5、Moto G | 28% |
| xxhdpi | 320-480 dpi | 3× | Samsung Galaxy S8、Pixel 3 | 38% |
| xxxhdpi | 480-640 dpi | 4× | Samsung Galaxy S24 Ultra、Pixel 9 Pro | 18% |
屏幕分辨率 — 宽度和高度的像素总数(例如 1080×2400)。屏幕密度 — 每英寸的像素数。两个分辨率相同的设备,如果屏幕的物理尺寸不同,则可能具有不同的密度。例如,一款 6 英寸分辨率为 1080×2400 的手机密度约为 440 dpi (xxhdpi),而一款 5 英寸相同分辨率的手机密度约为 530 dpi (xxxhdpi)。这是关键区别:界面必须适应密度,而不是分辨率,否则元素在高密度设备上会显得太小。
Android 在 res 文件夹名称中使用 qualifiers 来加载特定屏幕密度的资源:drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi。应用启动时,Android 从与设备密度最匹配的文件夹中选择资源。如果没有精确匹配,系统会选择最接近的 bucket 或从较低密度缩放资源。根据 Android Docs (2025),对于矢量 (VectorDrawable) 不需要密度限定符 — 它们会自动缩放。
/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) |
|---|---|---|---|
| mdpi | 1× | 48×48 | 48×48 |
| hdpi | 1.5× | 48×48 | 72×72 |
| xhdpi | 2× | 48×48 | 96×96 |
| xxhdpi | 3× | 48×48 | 144×144 |
| xxxhdpi | 4× | 48×48 | 192×192 |
正确准备 Density Buckets 的资源包括五条关键规则。第一,对简单图标使用 VectorDrawable — 这消除了对五个副本的需求。第二,对于栅格图像,从设计工具中一次性导出所有密度(Android Studio Asset Studio 会自动生成)。第三,避免将图像放在没有限定符的 drawable/ 中 — 系统会以质量损失进行缩放。第四,在与主要设备密度不同的设备上进行测试 — 模拟器允许更改密度。第五,使用 WebP 代替 PNG — 根据 Google (2025),WebP 在相同质量下可减少 25-35% 的大小。
常见问题
mdpi (medium-density pixel-independent) — Android 的基本 Density Bucket,密度为 160 dpi。所有其他 bucket 都相对于 mdpi 计算:hdpi — 1.5×、xhdpi — 2× 等等。mdpi 对应一个 density-independent pixel (dp) 对应一个物理像素。设计师在创建设计时正是以 mdpi 为基准。
使用 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,无需限定符的一个文件就足够了。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。