display.getRealMetrics()已废弃,官方推荐的替代方案是什么?
Android 12(API 级别 31)开始,Display#getRealMetrics() 被正式标记为废弃,官方推荐的替代方案根据使用场景分为两类:
场景1:获取当前应用窗口的实际显示尺寸(绝大多数业务场景推荐)
通过 WindowManager#currentWindowMetrics 直接获取当前绑定上下文的窗口边界,返回的尺寸包含应用占有的全部区域,兼容多窗口、折叠屏等多种设备形态:
val outMetrics = DisplayMetrics() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val windowManager = getSystemService(WindowManager::class.java) val windowMetrics = windowManager.currentWindowMetrics val bounds = windowMetrics.bounds // 填充DisplayMetrics参数 outMetrics.apply { density = resources.displayMetrics.density densityDpi = resources.displayMetrics.densityDpi scaledDensity = resources.displayMetrics.scaledDensity widthPixels = bounds.width() heightPixels = bounds.height() } } else { // 低版本兼容逻辑,复用原有实现 @Suppress("DEPRECATION") val display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { display } else { windowManager.defaultDisplay } @Suppress("DEPRECATION") display?.getRealMetrics(outMetrics) }
场景2:获取设备整块屏幕的最大物理尺寸
如果需要获取包含状态栏、导航栏等全部系统装饰区域的完整屏幕尺寸,使用 WindowManager#getMaximumWindowMetrics 即可:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val maxWindowMetrics = getSystemService(WindowManager::class.java).maximumWindowMetrics val fullScreenWidth = maxWindowMetrics.bounds.width() val fullScreenHeight = maxWindowMetrics.bounds.height() }
注意:不推荐直接通过 resources.displayMetrics 获取宽高,该方法返回的是应用的可用绘制区域尺寸,不会包含沉浸式区域、系统栏等部分,多窗口模式下取值也会和预期不符。
内容的提问来源于stack exchange,提问作者Tariq Hussain
相关产品推荐
相关产品推荐

