Runtime类图分析
Slider继承了Selectable, IDragHandler, IInitializePotentialDragHandler, ICanvasElement。
关键方法
SetValueWithoutNotify 只给滑动条设置对应的值,但是不去触发OnValueChanged事件
OnValidate 仅在编辑器下执行,在OnEnable之前调用,确定某些必须需要初始化的数据已经被初始化了
Rebuild 重建
OnEnable 更新缓存的引用的值,设置滑动条的值,更新Rect相关的值确保它们都已经被正确初始化过了
OnDisable 清空DrivenRectTransformTracker m_Tracker
Update 调用 UpdateVisuals 更新Slider
OnDidApplyAnimationProperties方法(应用动画属性时),会判断动画是否影响了表现,将表现修正回来
UpdateCachedReferences 更新缓存的Rect的值,包括m_FillRect和m_HandleRect
ClampValue 将传入的值限定在最小值和最大值之间
Set方法
调用ClampValue把value限制在minValue和maxValue之间,如果value改变,且sendCallback为true,便会发送m_OnValueChanged事件。同时会调用UpdateVisuals,更新Slider。
OnRectTransformDimensionsChange(当RectTransform尺寸发生变化时),调用UpdateVisuals,更新Slider
UpdateVisuals(),更新Slide
当m_FillImage.type == Image.Type.Filled时,改变m_FillImage.fillAmount调整进度条,否则调整m_FillRect.anchorMin和anchorMax,m_HandleRect.anchorMin和anchorMax,更新进度条和滑块的位置。
UpdateDrag()
将拖拽事件的点转换为m_HandleContainerRect上的点,减去Offset,除以m_HandleContainerRect的大小,得到normalizedValue,normalizedValue的set访问器会将它转换为value。
OnPointerDown(当鼠标点击或触摸按下),判断PointerDown事件的点是否在m_HandleRect区域内,如果在,把事件的点转换为m_HandleRect上的点,否则调用UpdateDrag,直接设置对应的值。
另外还重写了Selectable的OnMove、FindSelectableOnLeft、FindSelectableOnRight、FindSelectableOnUp和FindSelectableOnDown方法。当方向键按下并与Slider的方向一致时,便不在导航到下一个Selectable,而是修改value值(加减stepSize),即移动滑动条。
OnDrag,调用UpdateDrag,直接设置对应的值。
OnMove,在移动时调用Set方法设置滑动条的值
OnInitializePotentialDrag,设置事件useDragThreshold为false,即在拖拽事件开始前不需要额外的阈值判断。
当我们设置Slider的Direction时候,我们发现Slider发生了旋转。这就涉及到SetDirection方法。首先赋值新的direction,如果axis(Horizontal或Vertical)改变了,调用RectTransformUtility.FlipLayoutAxes,翻转坐标轴(例如从水平翻转到垂直)。如果reverseValue(反转值)改变了,调用RectTransformUtility.FlipLayoutOnAxis,水平翻转或垂直翻转。
SetDirection 设置滑动方向
重要属性和字段
RectTransform m_FillRect 填充的Rect
RectTransform m_HandleRect 滑动的Rect
Direction m_Direction 滑动方向
float m_MinValue 最小值
float m_MaxValue 最大值
bool m_WholeNumbers 是否以整数为步长增长滑动条
float m_Value 当前值
SliderEvent m_OnValueChanged 滑动条值改变的事件