LayoutGroup类
LayoutGroup是一个抽象类,继承了UIBehaviour, ILayoutElement, ILayoutGroup。HorizontalOrVerticalLayoutGroup和GridLayoutGroup继承自它。
继承自ILayoutController的方法,LayoutGroup的SetLayoutHorizontal和SetLayoutVertical是抽象方法,具体是在GridLayoutGroup、HorizontalLayoutGroup和VerticalLayoutGroup里实现的。
继承自ILayoutElement的方法,重写了CalculateLayoutInputHorizontal,找到子对象中所有的ILayoutIgnorer类型的组件,如果toIgnoreList.Count为0,就把子对象加入到m_RectChildren列表中。否则遍历toIgnoreList,如果ILayoutIgnorer的ignoreLayout为false,加入m_RectChildren列表。
HorizontalLayoutGroup类和VerticalLayoutGroup类
继承自ILayoutController的方法
SetLayoutHorizontal方法
先调用了LayoutGroup类的CalculateLayoutInputHorizontal方法,然后调用了HorizontalOrVerticalLayoutGroup类的 CalcAlongAxis(0, false),根据自己的可用宽度,计算和设置子对象的大小和位置。
SetLayoutVertical方法
调用了HorizontalOrVerticalLayoutGroup类的 CalcAlongAxis(1, false),根据自己的可用高度,计算和设置子对象的大小和位置。
![](/qrcode.jpg)
继承自ILayoutElement的方法
CalculateLayoutInputHorizontal方法
计算了布局元素的minWidth,preferredWidth和flexibleWidth值
CalculateLayoutInputVertical方法
计算了布局元素的minHeight,preferredHeight和flexibleHeight值
GridLayoutGroup类
CalculateLayoutInputHorizontal方法
- 先调用了LayoutGroup类的CalculateLayoutInputHorizontal方法,
- 如果是Constraint.FixedColumnCount固定的列数,设置minColumns和preferredColumns为给定的列数。
- 如果是Constraint.FixedRowCount固定行数,设置minColumns和preferredColumns为m_RectChildren列表的数目(在LayoutGroup计算出的元素数目)/给定的行数,
- 最后根据最小列数minColumns,计算布局元素的minWidth,preferredWidth和flexibleWidth值。
CalculateLayoutInputVertical方法
- 如果是Constraint.FixedColumnCount固定列数,设置minRows为m_RectChildren列表的数目(在LayoutGroup计算出的元素数目)/给定的列数,
- 如果是Constraint.FixedRowCount固定行数,设置minRows为固定行数。
- 然后根据最小行数minRows,计算布局元素的minHeight,preferredHeight和flexibleHeight值
SetLayoutHorizontal方法和SetLayoutVertical方法调用了SetCellsAlongAxis方法,遍历了m_RectChildren列表的数目,根据计算出actualCellCountX(实际的水平Cell数),actualCellCountY(实际的垂直Cell数),计算出每个Cell的Position,然后调用SetChildAlongAxis,根据每个Cell的Position和cellSize为包含的子对象设置大小和位置。
补充知识点,常用但容易混淆的运算符:
- 运算符^,异或,当且仅当只有一个true时,为true。
- 运算符~,按位求补运算符是为int、uint、long 和 ulong 类型预定义的。就是反转每一位。
- 左移运算符 (<<) ,左乘,将第一个操作数向左移动第二个操作数的位数。第二个操作数为int。例,1 << 3, 1向左移动3位,二进制为1000, 十进制为1 * 2的3次方,8
- 右移运算符 (>>) ,右除,将第一个操作数向右移动第二个操作数所指定的位数。例,8 >> 3, 8向右移动3位,二进制为0001, 十进制为8 / 2的3次方,1
- ?? 运算符,如果 ?? 运算符的左操作数非空,该运算符将返回左操作数,否则返回右操作数。