DisplayMetrics
DisplayMetrics是Android系统中android.util包下的一个类,用于描述一块显示屏的通用信息,包括像素尺寸、密度以及字体缩放系数等参数。它以密度无关像素为基准,把不同硬件密度的屏幕统一到同一套逻辑坐标系里,使界面元素在各类设备上保持接近的物理观感。应用通常通过资源对象或窗口管理器获取该类的实例,再据此换算像素与密度单位、适配不同分辨率的屏幕。
定义
DisplayMetrics是Android系统中位于android.util包下的一个类,其作用是描述显示屏的通用属性,例如屏幕尺寸、密度和字体缩放情况[1]。类中集中保存了一组公开字段,涵盖屏幕的绝对宽高、逻辑密度、以每英寸点数为单位的密度值、显示字体的缩放系数以及横纵两个方向上的物理每英寸像素数[2]。
该类本身只是承载数据的结构,并不直接绘制界面,开发者拿到实例后读取其中的数值,用于在代码里完成尺寸换算与布局判断,因此它属于Android界面适配体系中的基础参数载体[3]。
原理
DisplayMetrics各字段围绕一个基准展开:系统约定以每英寸160点作为参考密度,此时逻辑密度取值为1,密度无关像素与物理像素一一对应;屏幕密度变化时,逻辑密度按整体比例阶梯式调整,而不是严格跟随实际物理尺寸[4]。换算关系可概括为 $密度无关像素 = 像素 \times 160 \div 密度值$,因此同样像素数的控件,在高密度屏幕上占据的物理面积更小[5]。
字体使用的缩放系数与逻辑密度基本相同,区别在于它会在运行期依据用户设定的字号做更细的调整,这也是字体缩放系数后来被标记为弃用、建议改用单位换算接口的原因[6]。物理每英寸像素数则记录屏幕实际精度,横纵方向分开给出,与经过阶梯化处理的逻辑密度并不等同[2]。
发展历程
相关源码文件带有2006年Android开源项目的版权声明,说明该类在Android早期版本中就已存在[x],并长期作为显示信息的标准容器。
随着屏幕规格增多,类中陆续加入若干介于标准档位之间的中间密度常量,例如260、280、300、340、360、400、420、440、520、560、600等,用于匹配实际硬件,同时官方建议应用不必为这些中间档位单独准备图形资源,交由系统缩放即可[7]。密度档位也从早期较低的120、160、240、320逐步扩展到480、640等更高取值[5]。
后期版本对字段用途做了收窄:文档指出界面布局应从窗口管理器取得窗口度量信息,DisplayMetrics只宜用于获取显示相关属性;同时在2023年3月的接口变更记录中,字体缩放系数被列为弃用,API级别34的说明也标明该系数因自适应非线性字体缩放而不再准确[8]。
应用
获取实例的常见方式是通过上下文取得资源对象后调用其显示参数接口,或由窗口管理器在获取默认显示信息时填充该对象[3]。拿到数值后,可用于把设计稿中的像素值换算成密度无关像素,或把字号在像素与缩放单位之间转换[9]。
在跨平台框架中也有对应封装,例如设备信息类插件会以该结构为基础暴露物理宽高、对角线尺寸和横纵每英寸像素数等属性[10]。此外,系统在兼容模式下会依据兼容信息对密度、宽高与每英寸像素数按比例缩放,以维持旧应用在新型屏幕上的显示比例。
局限
逻辑密度并非真实物理精度的精确反映,它按显示密度的粗略变化分档调整,因此不能用来反推屏幕的物理尺寸[4]。当存在兼容模式缩放时,对象中的数值还可能经过比例折算,进一步偏离硬件原始参数[5]。
字体缩放系数在API级别34被弃用,官方说明其不再适用于自适应非线性字体缩放场景,换算字体单位需要改用单位转换接口;显示参数也只应承担与显示属性相关的读取,界面布局需要的是窗口度量信息[6]。另外,屏幕可用的宽高会随状态栏、导航栏等系统装饰而变化,静态参数难以覆盖旋转和临时遮挡带来的尺寸范围[11]。
参见
参考资料
- DisplayMetrics [引用日期2026-10-14]
- DisplayMetrics [引用日期2026-10-14]
- android.util [引用日期2026-10-14]
- DisplayMetrics [引用日期2026-10-14]
- DisplayMetrics [引用日期2026-10-14]
- DisplayMetrics | API reference | Android Developers [引用日期2026-10-14]
- DisplayMetrics [引用日期2026-10-14]
- Class android.util. DisplayMetrics [引用日期2026-10-14]
- Revision cde387e3-49b4-49ea-bb4f-60d052024283 [引用日期2026-10-14]
- AndroidDisplayMetrics class [引用日期2026-10-14]
- Display | Android Developers [引用日期2026-10-14]