G2 从很早的版本,就是使用 auto padding 的机制去布局,这个并没有什么问题,未来的 G2 依然会会有 padding 的概念。
但是因为之前的 auto padding 计算逻辑,会带来一些额外布局问题,所以这里将布局过程改成使用约束布局的逻辑,这其中具体的,之前很多文档提过,这里不赘述。
这里就分成几步,保证在 4.2 版本中兼容,并且未来的 5.x 代码很容易的去升级组件:
- 约束布局求解器(以后可能会在很多地方用到
- 生成约束条件
- 求解(布局)
- 移动组件到对应的位置
约束布局
约束布局,也是在 UI 布局中经常使用的东西,利用一次不等式方程组,可以计算出每个部分的位置宽高,达到布局的目的。
对于 G2 的场景来说,我们进行一些优化,因为 G2 的场景可以理解是当前并不需要使用不等式组,完全使用等式方程,可以有效提高约束布局计算的性能。
那么对于约束条件都是等式的求解,其实就是高斯消元法了。具体在 G2 的实现为:#3622。是一个非常独立的模块,未来也是可以完全抽离出来的。
生成约束
之前的逻辑是,按照四个方向,不断的去裁剪 bbox,在裁剪过程中,去计算对应组件的 x y w h。然后裁剪剩余的大小就是 geometry bbox 也就是 coordinate 的位置大小。
现在的逻辑会改成:
- 遍历不同方向的组件,存储起来
- 根据方向和组件,生成详尽约束条件(只准冗余,不能缺少)
- 组件的初始大小(新建一个虚拟实例,获取大小,后续这部分会变成 width、height 的百分比,用户可以设置固定的 px)
- 约束关系
- new Solver().clac()
- 更新对应组件的 x y width height
- render
这里的核心问题:
- 怎么逻辑性好的生成全面的 constraint,因为如果生成不全,求解不出答案
- 性能对比、性能优化,约束布局的性能对比见这里,这里因为优化为等式求解,所以性能会高很多
具体的 PR 见:#3622