Android:display.getMetrics()与getDisplayMetrics()的区别及代码中metrics1和metrics2的差异咨询
Android:display.getMetrics()与getDisplayMetrics()的区别及代码中metrics1和metrics2的差异咨询
嘿,这个问题问得很有针对性,刚好我对Android显示度量这块摸得比较熟,来给你拆解下代码里metrics1和metrics2的核心差异:
一、先理清两者的获取逻辑
咱们先分别拆解两个对象的来源:
metrics1的获取:
它来自activity.getResources().getDisplayMetrics(),是当前Activity的Resources实例维护的显示度量对象。Resources是管应用资源适配的核心类,这个度量对象和应用的资源配置上下文深度绑定——比如密度桶适配、系统显示缩放比例这些配置都会直接影响它的参数。而且Resources内部会缓存这个实例,同一个Activity里多次调用返回的都是同一个对象引用。metrics2的获取:
代码里做了API版本兼容:API30及以上用activity.getDisplay()拿到当前Activity所在的显示设备,API30以下用WindowManager.getDefaultDisplay()拿设备主显示,再通过display.getMetrics(metrics2)把显示设备的真实度量值填充到咱们自己new的metrics2里。这个对象完全基于显示硬件的状态,和应用自身的资源配置不挂钩。
二、核心差异点
1. 绑定的上下文完全不同
metrics1紧跟应用资源配置:比如咱们的应用适配了xxhdpi密度桶,或者用户在系统设置里调了显示缩放比例,metrics1的参数会自动跟着适配调整;要是Activity因为配置变更(比如切换系统语言)重建,它也会同步更新为新配置下的值。metrics2只认显示硬件:不管应用怎么适配,它只反映当前显示设备的真实参数——比如多屏设备上的副屏尺寸、显示硬件的原始密度,只受系统全局显示设置(比如缩放)影响,和应用自身的资源配置无关。
2. 实例的复用性与独立性不同
metrics1是Resources维护的单例:同一个Activity里多次调用getResources().getDisplayMetrics(),拿到的都是同一个对象。要是你手动修改这个对象的属性(比如瞎改density),会影响所有后续调用该方法的地方,绝对不建议这么干!metrics2是你完全掌控的独立实例:每次都是你自己new一个新对象,调用display.getMetrics()只是把最新的显示参数写入进去,修改它也不会影响其他代码,非常安全。
3. 多场景下的表现有区别
- 多屏设备场景:API30+时,
metrics2能准确拿到当前Activity所在副屏的度量;而metrics1还是基于应用的资源配置,要是副屏密度和主屏不一样,两者的密度参数就会有明显差异。 - 配置变更场景:比如用户切换系统语言导致Activity重建,
metrics1会跟着更新为新配置的值;metrics2则纹丝不动,除非显示设备本身发生变化(比如切换到副屏)。
三、实际开发怎么选?
- 如果你要做和资源适配相关的操作:比如计算布局尺寸、加载对应密度的图片/资源,选
metrics1的方式,它能保证和应用的资源适配逻辑完全对齐,不会出适配问题。 - 如果你要获取显示设备的真实状态:比如多屏适配、检测显示硬件参数,选
metrics2的方式,它能给你最准确的显示硬件数据。
要是还有细节疑问,随时提出来~




