返回介绍

4. 小结

发布于 2024-12-23 21:06:23 字数 943 浏览 0 评论 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 的解析到此结束 感谢您的观阅读。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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