源码5:Button
前面讲了Selectable的作用 和相关的操作。在UGUI里很多UI控件都是继承Selectable的:Button DropDown Scrollbar Slider Toggle 。 这里就以Button为准分析一下
public class Button : Selectable, IPointerClickHandler, ISubmitHandler
{
[Serializable]
/// <summary>
/// Function definition for a button click event.
/// </summary>
public class ButtonClickedEvent : UnityEvent {}
// Event delegates triggered on click.
[FormerlySerializedAs("onClick")]
[SerializeField]
private ButtonClickedEvent m_OnClick = new ButtonClickedEvent();
protected Button()
{}
...
}
Button 除了继承Selectable 还继承了IPointerClickHandler ISubmitHandler
还定义了一个UnityEvent类型的事件onClick事件
onClick事件可以通过onClick.AddListener方法,添加用户自定义的监听
public virtual void OnPointerClick(PointerEventData eventData)
{
if (eventData.button != PointerEventData.InputButton.Left)
return;
Press();
}
private void Press()
{
if (!IsActive() || !IsInteractable())
return;
UISystemProfilerApi.AddMarker("Button.onClick", this);
m_OnClick.Invoke();
}
OnPointerClick方法,会通过Press方法回调onClick。
public virtual void OnSubmit(BaseEventData eventData)
{
Press();
// if we get set disabled during the press
// don't run the coroutine.
if (!IsActive() || !IsInteractable())
return;
DoStateTransition(SelectionState.Pressed, false);
StartCoroutine(OnFinishSubmit());
}
private IEnumerator OnFinishSubmit()
{
var fadeTime = colors.fadeDuration;
var elapsedTime = 0f;
while (elapsedTime < fadeTime)
{
elapsedTime += Time.unscaledDeltaTime;
yield return null;
}
DoStateTransition(currentSelectionState, false);
}
OnSubmit 主要是为了响应像是键盘等回车输入 模拟点击确认等作用 C上也可以在Edit->Project->Input里设置Submit键。
当按下Submit键的时候就会触发OnSubmit方法。因为Selectable上并没有Submit 相关对应的状态
所以这里设置为Pressed 状态 进行Trasition
OnFinishSubmit 就是将状态重置
可以看出Button就是相对于Selectable添加了响应点击和确认事件的接口,并且开放了可添加用户自定义监听的onClick事件。