UGUI源码解析(Scrollbar)

Runtime类图分析

Scrollbar,它继承自Selectable,还继承了 IBeginDragHandler, IDragHandler, IInitializePotentialDragHandler, ICanvasElementt四个接口。


关键方法

Rebuild()

Rebuild继承自ICanvasElement,它在重建Layout的时候被调用。

 

重写OnEnable

重新设置Value,调用UpdateVisuals,刷新Scrollbar显示。即根据当前Value设置m_HandleRect的anchorMin和anchorMax,体现出来就是滚动条的位置发生了变化,同时把Scrollbar添加到DrivenRectTransformTracker类型的m_Tracker。

 

重写OnDisable

只是调用DrivenRectTransformTracker类型的m_Tracker的Clear方法。

 

Update

根据延迟更新的视觉效果更新rect

 

UpdateCachedReferences

更新m_ContainerRect的值

 

Set方法

用于设置m_Value的值,并发送事件onValueChanged.Invoke(value)。除此之外,Set方法还会调用UpdateVisuals,刷新Scrollbar显示。

 

重写OnRectTransformDimensionsChange方法

调用UpdateVisuals,刷新Scrollbar显示

 

UpdateVisuals

刷新Scrollbar显示

 

UpdateDrag

基于鼠标更新Scrollbar的位置

 

OnBeginDrag

继承自IBeginDragHandler接口,这个方法记录了拖拽的起始点(m_HandleRect内相对center的坐标)。

 

OnDrag

继承自IDragHandler接口,这个方法会调用UpdateDrag方法,用于基于鼠标更新Scrollbar的位置。这个方法会计算出m_HandleRect左下角的坐标,根据Direction与剩下的尺寸(就是可滑动区域的尺寸)作比,计算出value。

 

重写OnPointerDown方法

设置isPointerDownAndNotDragging为true,开启协程ClickRepeat,判断点击事件是否在m_HandleRect外面(一定在Scrollbar里面),如果在外面,就将事件坐标转换到m_HandleRect的本地坐标系里,然后调整value,直到点击事件在m_HandleRect里面。

 

重写OnPointerUp方法

设置isPointerDownAndNotDragging为false。

 

另外还重写了Selectable的OnMoveFindSelectableOnLeftFindSelectableOnRightFindSelectableOnUpFindSelectableOnDown方法。

当方向键按下并与ScrollBar的方向一致时,便不在导航到下一个Selectable,而是修改value值(加减stepSize),即移动滚动条。

 

 

OnInitializePotentialDrag方法

是继承自IInitializePotentialDragHandler的方法,它将拖拽事件的useDragThreshold设置为false。

 

SetDirection

设置ScrollBar的方向

 

重要属性和字段

 

Scrollbar有一个float变量m_Value表示当前Scrollbar的值,变化范围在[0, 1]之间,还添加了一个UnityEvent<float>类型的事件onValueChanged,用于外部监听m_Value是否改变。

 

补充知识点

DrivenRectTransformTracker:

DrivenRectTransformTracker结构用于指定它正在驱动哪个RectTransform,驱动RectTransform意味着被驱动的RectTransform的值由该组件控制。

 

RectTransformUtility:

RectTransformUtility.FlipLayoutAxes 翻转RectTransform大小和对齐的水平和垂直轴,以及可选的子对象。

RectTransformUtility.FlipLayoutOnAxis 沿水平或垂直轴翻转RectTransform的对齐方式,以及可选的子对象。

RectTransformUtility.PixelAdjustPoint 将屏幕空间中的给定点转换为像素正确的点。

RectTransformUtility.PixelAdjustRect 给定矩形变换,以像素精确坐标返回角点。

RectTransformUtility.RectangleContainsScreenPoint RectTransform是否包含从相机看到的点。

RectTransformUtility.ScreenPointToLocalPointInRectangle 将屏幕空间点转换为给定RectTransform平面上的局部空间中的位置。

RectTransformUtility.ScreenPointToWorldPointInRectangle 将屏幕空间点转换为位于给定RectTransform平面上的世界空间中的位置。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值