系列
UGUI源码分析系列总览
相关前置:
UGUI EventSystem源码分析
UGUI源码分析:Selectable交互组件的基类
文章目录
Toggle
BaseClass: Selectable
Interface: IPointerClickHandler,ISubmitHandler,ICanvasElement
Intro: UGUI中常用于控制单选或者多选功能的组件,经常与ToggleGroup一起使用
- IPointerClickHandler:点击事件的响应接口
- ISubmitHandler:Submit按键点击事件的响应接口。
- ICanvasElement: Canvas元素(重建接口),当Canvas发生更新时执行重建操作
Toggle组件属性介绍
- Interactable:是否可被交互(false时无法通过EventSystem进行交互)
- Transition:状态变化过渡模式(相关详情)
- Navigation:导航(相关详情)
- IsOn :Toggle状态属性
- ToggleTransition :控制Graphic透明度变化的过渡模式(渐变/无)
- Graphic :根据IsOn的值透明度会发生0或1的变化
- Group : 用于绑定ToggleGroup组件
Toggle主要是通过一个bool值m_IsOn进行两种状态的切换(True/False),并通过一个监听事件传递状态的变化。
初始化过程
Enable阶段主要时将自身注册进ToggleGroup中,并根据当前状态执行特效变化。
Disable阶段会将自身从当前ToggleGroup组件中移除。
protected override void OnEnable()
{
base.OnEnable();
SetToggleGroup(m_Group, false);//含有ToggleGroup组件时,将自身注册进ToggleGroup中
PlayEffect(true);//执行变化特效,渐变graphic的透明度
}
protected override void OnDisable()
{
SetToggleGroup(null, false);//从当前的ToggleGroup中移除该组件
base.OnDisable();
}
IsOn
toggle组件最核心的地方在于这个bool值,该值可以通过点击(OnPointerClick)、按键(OnSubmit)、以及ToggleGroup进行改变。当IsOn发生改变时:
//IsOn属性Set方法 value:变化值 sendCallback 是否执行监听事件:默认true
void Set(bool value,bool sendCallback)
{
if (m_IsOn == value)
return;
m_IsOn = value;
if (m_Group != null && IsActive())
{
//当存在Group时,自身的变化需要通知Group,使其控制其他Toggle的状态
if (m_IsOn || (!m_Group.AnyTogglesOn() && !m_Group.allowSwitchOff))
{
m_IsOn = true;
m_Group.NotifyToggleOn(this);
}
}
//执行变化特效,渐变graphic的透明度0或1
PlayEffect(toggleTransition == ToggleTransition.None);
if (sendCallback)
{
UISystemProfilerApi.AddMarker("Toggle.value", this);
onValueChanged.Invoke(m_IsOn);//执行监听事件
}
}
ToggleGroup
ToggleGroup组件用来帮助Toggle捆绑成组,使其完成X选1或者多选的功能。它管理了一个List<Toggle>,当Toggle初始化时,会将自身注册进List中,到被销毁时会将自身移除。
ToggleGroup向外提供了一个bool值属性 allowSwitchOff 来控制一组Toggle中是否运行出现全是OFF的状态。
//Toggle组件IsOn属性Set方法中一段
if (m_IsOn || (!m_Group.AnyTogglesOn() && !m_Group.allowSwitchOff))
{
//当Group.allowSwitchOff为false时将默认被操作的Toggle的IsOn设置为True
m_IsOn = true;
m_Group.NotifyToggleOn(this);
}
在单选模式中(allowSwitchOff = false): 当一组Toggle中出现点击或是Submit操作时,会将其IsOn变化为True状态并执行Group的NotifyToggleOn方法,该方法会遍历其List中除此之外的所有Toggle,使它们变为False状态。
public void NotifyToggleOn(Toggle toggle)
{
ValidateToggleIsInGroup(toggle);//判断当前Toggle是否存在List中
//遍历出当前Toggle外的所有Tgoole,改变它们的状态为False
for (var i = 0; i < m_Toggles.Count; i++)
{
if (m_Toggles[i] == toggle)
continue;
m_Toggles[i].isOn = false;
}
}
.
.
.
.
.
嗨,我是作者Vin129,逐儿时之梦正在游戏制作的技术海洋中漂泊。知道的越多,不知道的也越多。希望我的文章对你有所帮助:)