Android Studio中获取可用屏幕尺寸(横屏、全屏)以避免UI截断的最佳方案咨询
Android Studio中获取可用屏幕尺寸(横屏、全屏)以避免UI截断的最佳方案咨询
嘿,我来帮你分析下这几个方案,告诉你最靠谱的选择:
首先,最优解是Option 2: WindowMetrics(API 30+),这是官方现在推荐的方法,能精准获取应用实际可用的屏幕空间——不管是横屏还是全屏模式,它都会自动考虑状态栏、导航栏这些系统UI的占用,直接给你能安全放置UI的尺寸,完全不用担心截断问题。
给你个简单的代码示例(Kotlin):
val windowMetrics = activity.windowManager.currentWindowMetrics // 获取系统栏的Insets,忽略它们的可见性(比如全屏时隐藏导航栏也能拿到原本的占位) val insets = windowMetrics.windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()) // 计算实际可用的宽高 val usableScreenWidth = windowMetrics.bounds.width() - insets.left - insets.right val usableScreenHeight = windowMetrics.bounds.height() - insets.top - insets.bottom
再说说其他几个方案的局限:
- Option 1: DisplayMetrics:这是比较老旧的方法,它拿到的是屏幕的物理总尺寸,完全没考虑状态栏、导航栏的占用。用这个数值来布局的话,很容易把UI塞进系统UI的区域,导致被截断,而且在多窗口模式下也不准。
- Option 3: Resources:通过
resources.displayMetrics本质和DisplayMetrics是一回事,同样只能拿到屏幕整体尺寸,无法排除系统UI的影响,不是实际可用的布局空间。 - Using View (Root View Dimensions):这个方法得等View完全绘制完成才能拿到准确值,如果在
onCreate里直接调用,得到的可能是0或者错误的数值。就算监听View的尺寸变化,操作起来也比WindowMetrics麻烦,可靠性也不如前者。
总结一下:如果你的App最低兼容版本是API 30及以上,直接用WindowMetrics就完事;如果要兼容更低版本,可以做版本判断,低版本用DisplayMetrics结合View的OnGlobalLayoutListener来补充,但优先推荐WindowMetrics,准确性和易用性都拉满。
备注:内容来源于stack exchange,提问作者Gabriel K
相关产品推荐
相关产品推荐

