UGUI源码剖析(Slider)

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 滑动条值改变的事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值