美文网首页
1.布局过程之测量阶段

1.布局过程之测量阶段

作者: 真胖大海 | 来源:发表于2018-04-29 19:55 被阅读49次

1.什么是布局过程

布局是计算控件大小和位置的过程。

布局过程分为两个阶段

  1. 测量阶段
    计算控件及其子控件的大小
  2. 布局阶段
    计算子控件的位置

2.测量和布局阶段原理总览

image
image

3.测量阶段的原理细讲

父容器在onMeasure方法中先测量出child的尺寸,然后再测量出自己的尺寸

以AbsoluteLayout为例

  1. 调用ViewGroup.measureChildren()测量所有child的尺寸
    测量好后child会调用setMeasuredDimension保存测量的尺寸,
    然后可以通过child的view.getMeasuredWidth获取测量的尺寸。

    ViewGroup.getChildMeasureSpec函数很关键(承上启下的作用)
    getChildMeasureSpec(int spec, int padding, int childDimension)
    根据ViewGroup的parentWidthMeasureSpec,Child的widthMeasureSpec计出Child的最终的widthMeasureSpe

  2. 根据child测量得到的尺寸计算得到AbsoluteLayout最大的尺寸

  3. 根据计算得到的maxWidth,自己的withMeasureSpec,得到自己的尺寸,并保存。

测量过程
AbsoluteLayout测量阶段的相关函数

4.总结

  1. 为什么会将尺寸由 尺寸模式和尺寸尺寸?
    因为控件的尺寸大小不是由自己决定的,还要考虑到父容器的大小
    尺寸模式其实是父容器约束child大小的一种方式
    见getChildMeasureSpec()函数。
  2. 调用ViewGroup.measureChildren()测量所有child的尺寸 ,
    然后child会调用view.setMeasuredDimension保存测量的尺寸,
    然后通过child的view.getMeasuredWidth获取测量的尺寸。
  3. ViewGroup.getChildMeasureSpec函数很关键
    getChildMeasureSpec(int spec, int padding, int childDimension)
    根据ViewGroup的parentWidthMeasureSpec,Child的widthMeasureSpec计出Child的最终的widthMeasureSpec
  4. 如果想手动测量某个View的尺寸
    调用View.measure()方法

todo

MeasureSpec的几种模式

相关文章

网友评论

      本文标题:1.布局过程之测量阶段

      本文链接:https://www.haomeiwen.com/subject/ivlalftx.html