2019-03-06 全面屏适配:布局根据规则自适应

2019-03-07  本文已影响0人  罗力
目标效果

接到需求后的一系列心理活动

  1. 卧槽,适配规则竟然这么复杂
  2. (经过一番计算后)没想到现在画UI还需要做数学题(结果后附)
  3. 能用布局文件实现这适配规则最好,尽量不要写代码来处理(希望能将逻辑内聚到布局里)
  4. (其实靠布局文件实现的话,后面看布局重新理解也是很困难的)

需求实施过程中的一系列问题求解

Q: 梳理一下规则

Q: 是否可以通过定义对应的布局文件

Q: 关于屏幕/应用显示区域大小

  1. 屏幕指物理屏幕的大小
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val screenSize = Point().apply { windowManager.defaultDisplay.getRealSize(this) }
Log.i(TAG, "screen=(W:${screenSize.x}, H:${screenSize.y})")
  1. 应用显示区域指应用可绘制的窗口大小
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val displaySize = Point().apply { windowManager.defaultDisplay.getSize(this) }
LogUtil.i(TAG, "display=(W:${displaySize.x}, H:${displaySize.y})")
  1. 物理屏幕的大小大于等于应用可绘制窗口的大小
  2. 物理屏幕大小包含:顶部状态栏、应用显示区域、底部导航栏
  3. 应用可绘制窗口大小包含:

Q: 通过获取屏幕大小/应用显示区域的大小,直接计算各部位的高度,直接配置?

A: 不建议。
一方面不论采用屏幕大小还是应用显示区域大小,进行计算,都无法完美的适配各种屏幕(?)。
另一方面,这个实现方式本质上将父布局的大小等同于显示区域的大小,将其作为隐含的假设,固化在了实现中;而实质上适配方案是需要随着外层父布局的大小而变化的。
基于后续可维护性方面的考量,这种实现方式并不合适。

上一篇 下一篇

猜你喜欢

热点阅读