UGUI源码解析(二十一)LayoutRebuilder

LayoutRebuilder

Graphic是通过MarkLayoutForRebuild这个静态方法标记自己需要重建的。

MarkLayoutForRebuild方法

  • 找到父对象中最近的ILayoutGroup类型的组件layoutRoot,并为其创建LayoutRebuilder。
  • 从s_Rebuilders栈中Pop出一个LayoutRebuilder,s_Rebuilders是一个LayoutRebuilder类型的ObjectPool,调用LayoutRebuilder.Initialize,传入ILayoutGroup类型组件,进行初始化
  • 如果创建的LayoutRebuilder已经在CanvasUpdateRegistry的布局重建序列中,从s_Rebuilders栈中移除创建的LayoutRebuilder。否则,把创建的LayoutRebuilder注册到CanvasUpdateRegistry的布局重建序列中。

 

LayoutRebuilder继承了ICanvasElement,在CanvasUpdateRegistry中遍历所有注册到它的ICanvasElement类型的组件,调用他们的Rebuild方法。

Rebuild方法

在Rebuild方法中,先调用水平方向的PerformLayoutCalculation和PerformLayoutControl。然后再调用垂直方向的PerformLayoutCalculation和PerformLayoutControl。

PerformLayoutCalculation方法

  • 调用PerformLayoutCalculation,第一个参数m_ToRebuild(就是之前保存在LayoutRebuilder里的layoutRoot),第二个参数传入ILayoutElement.CalculateLayoutInputHorizontal()或ILayoutElement.CalculateLayoutInputVertical(),作为回调函数。
  • 然后以m_ToRebuild的子对象为参数,递归调用PerformLayoutCalculation方法,先计算子对象布局,然后计算父对象布局。
  • 布局计算需要从下往上计算,先计算子对象,然后再计算父对象的布局。因为父对象布局计算依赖子对象的大小。

PerformLayoutControl方法

  • 调用PerformLayoutControl方法,第一个参数m_ToRebuild(就是之前保存在LayoutRebuilder里的layoutRoot),第二个参数传入ILayoutController.SetLayoutHorizontal()或ILayoutController.SetLayoutVertical(),作为回调函数。
  • 在m_ToRebuild节点上,遍历找到的所有的ILayoutController类型的组件components,
  • 先处理components组件中为ILayoutSelfController类型的情况,也就是先处理本身的RectTransform大小设置,
  • 然后处理处理components组件中不是ILayoutSelfController类型的情况,处理比如子对象的布局组(LayoutGroup)的RectTransform大小设置。
  • 然后以m_ToRebuild的子对象为参数,递归调用PerformLayoutControl方法,处理子对象本身的RectTransform大小和子对象的子对象的RectTransform大小。

 

LayoutComplete方法

把自己从s_Rebuilders中释放,并放入对象池中,以便下次再次使用。在CanvasUpdateRegistry中,会调用所有元素的LayoutComplete方法。

 

ILayoutController接口

如果一个组件正在驱动它自己的RectTransform,它应该实现接口ILayoutSelfController。如果一个组件正在驱动子组件的RectTransforms,它应该实现ILayoutGroup。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值