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的OnMove、FindSelectableOnLeft、FindSelectableOnRight、FindSelectableOnUp和FindSelectableOnDown方法。
当方向键按下并与ScrollBar的方向一致时,便不在导航到下一个Selectable,而是修改value值(加减stepSize),即移动滚动条。
OnInitializePotentialDrag方法
是继承自IInitializePotentialDragHandler的方法,它将拖拽事件的useDragThreshold设置为false。
SetDirection
设置ScrollBar的方向
Scrollbar有一个float变量m_Value表示当前Scrollbar的值,变化范围在[0, 1]之间,还添加了一个UnityEvent
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平面上的世界空间中的位置。