UGUI源码解析(二十四)LayoutGroup

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq826364410/article/details/88142245

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),根据自己的可用高度,计算和设置子对象的大小和位置。

继承自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
  • ?? 运算符,如果 ?? 运算符的左操作数非空,该运算符将返回左操作数,否则返回右操作数。

猜你喜欢

转载自blog.csdn.net/qq826364410/article/details/88142245