返回介绍

4. 小结

发布于 2024-12-23 21:06:23 字数 943 浏览 0 评论 0 收藏

在这里,我们花费了大篇幅讲解 measureVertical() 的流程,事实上对于 LinearLayout 来说,其最大的特性也正是两个方向的排布以及 weight 的计算方式。

在这里我们不妨回过头看一下,其实我们会发现在测量过程中,设计者总是有意分开含有 weight 和不含有 weight 的测量方式,同时利用 height 跟 0 比较来更加的细分每一种情况。

可能初看的时候觉得代码太多,事实上一轮分析下来,方向还是很清晰的。毕竟有 weight 的地方前期都给个标志跳过,在测量完需要的数据(比如父控件的总高度什么的)后,再根据父控件的数据和 weight 再针对进行二次测量。

在文章的最后,我们小结一下对于测量这里的算法的不同情况下的区别以及原理:

  • 父控件是 match_parent(或者精确值),子控件拥有 weight,并且高度给定为 0:子控件的高度比例将会跟我们分配的 layout_weight 一致,原因在于 weight 二次测量时走了 else 分支,传入的是计算出来的 share 值
  • 父控件是 match_parent(或者精确值),子控件拥有 weight,但高度给定为 match_parent(或者精确值):子控件高度比例将会跟我们分配的 layout_weight 相反,原因在于在此之前子控件测量过一次,同时子控件的测量高度为父控件的高度,在计算剩余空间的时候得出一个负值,加上自身的测量高度的时候反而更小
  • 父控件是 wrap_content,子控件拥有 weight:子控件的高度将会强行置为其 wrap_content 给的值并以 wrap_content 模式进行测量
  • 父控件是 wrap_content,子控件没有 weight:子控件的高度跟其他的 viewgroup 一致

至此,LinearLayout 针对 measure 的解析到此结束 感谢您的观阅读。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。