ToggleGroup的使用
使用方法很容易,目的是為了實現在一組Toggle內只能勾選一個
1、建立空的GameObject然後綁上一個ToggleGroup,
2、建立一組Toggle,將所有Toggle的Group屬性指向前面的ToggleGroup,到此完成工作
ToggleGroup內有個AllowSwitchOff選項:
勾選:則可以取消所有的勾選項
不勾選:則一定會存在有一個勾選項
內部原始碼(from uGUI-2018.2)
private void SetToggleGroup(ToggleGroup newGroup, bool setMemberValue)
{
ToggleGroup oldGroup = m_Group;
// Sometimes IsActive returns false in OnDisable so don't check for it.
// Rather remove the toggle too often than too little.
if (m_Group != null)
m_Group.UnregisterToggle(this);
// At runtime the group variable should be set but not when calling this method from OnEnable or OnDisable.
// That's why we use the setMemberValue parameter.
if (setMemberValue)
m_Group = newGroup;
// Only register to the new group if this Toggle is active.
if (newGroup != null && IsActive())
newGroup.RegisterToggle(this);
// If we are in a new group, and this toggle is on, notify group.
// Note: Don't refer to m_Group here as it's not guaranteed to have been set.
if (newGroup != null && newGroup != oldGroup && isOn && IsActive())
newGroup.NotifyToggleOn(this);
}
在設定Toggle的Group時,會將所有的Toggle註冊到同一個ToggleGroup中,並通知開關方法NotifyToggleOn
public void NotifyToggleOn(Toggle toggle)
{
ValidateToggleIsInGroup(toggle);
// disable all toggles in the group
for (var i = 0; i < m_Toggles.Count; i++)
{
if (m_Toggles[i] == toggle)
continue;
m_Toggles[i].isOn = false;
}
}
當點選其中一個Toggle的時候,會觸發註冊的OnPointerClick,主要是NotifyToggleOn和PlayEffect以及自定義的onValueChanged回撥
public virtual void OnPointerClick(PointerEventData eventData)
{
if (eventData.button != PointerEventData.InputButton.Left)
return;
InternalToggle();
}
private void InternalToggle()
{
if (!IsActive() || !IsInteractable())
return;
isOn = !isOn;
}
public bool isOn
{
get { return m_IsOn; }
set
{
Set(value);
}
}
void Set(bool value)
{
Set(value, true);
}
void Set(bool value, bool sendCallback)
{
if (m_IsOn == value)
return;
// if we are in a group and set to true, do group logic
m_IsOn = value;
if (m_Group != null && IsActive())
{
if (m_IsOn || (!m_Group.AnyTogglesOn() && !m_Group.allowSwitchOff))
{
m_IsOn = true;
m_Group.NotifyToggleOn(this);
}
}
// Always send event when toggle is clicked, even if value didn't change
// due to already active toggle in a toggle group being clicked.
// Controls like Dropdown rely on this.
// It's up to the user to ignore a selection being set to the same value it already was, if desired.
PlayEffect(toggleTransition == ToggleTransition.None);
if (sendCallback)
{
UISystemProfilerApi.AddMarker("Toggle.value", this);
onValueChanged.Invoke(m_IsOn);
}
}
NotifyToggleOn上面已經貼出程式碼了,下面是PlayEffect,其實就是改變了graphic的透明度,做一個Tween動畫
private void PlayEffect(bool instant)
{
if (graphic == null)
return;
#if UNITY_EDITOR
if (!Application.isPlaying)
graphic.canvasRenderer.SetAlpha(m_IsOn ? 1f : 0f);
else
#endif
graphic.CrossFadeAlpha(m_IsOn ? 1f : 0f, instant ? 0f : 0.1f, true);
}
相關文章
- UGUI原始碼解析(Toggle和ToggleGroup)UGUI原始碼
- Scrapy框架的使用之Scrapyrt的使用框架
- ActiveMQ的使用及整合spring的使用例項MQSpring
- Docker框架的使用系列教程(四)容器的使用Docker框架
- Urllib庫的使用一---基本使用
- ECharts的使用Echarts
- DbVisualizer的使用
- Typeof的使用
- iview 的使用View
- Trait 的使用AI
- lombok的使用Lombok
- MybatisGenerator的使用MyBatis
- valueForKeyPath的使用
- ThreadLocal的使用thread
- elasticsearch的使用Elasticsearch
- CoreData的使用
- joomla的使用OOM
- sqlmap的使用SQL
- echars的使用
- SVG 的使用SVG
- FlowableAPI的使用API
- pycnblog的使用
- netcat的使用
- jextract的使用
- pinia的使用
- pip 的使用
- DBV 的使用
- Docker的使用Docker
- Promise的使用Promise
- SVN的使用
- EndNote的使用
- git的使用+Git
- git 的使用Git
- Bootstarp的使用boot
- GRPC的使用RPC
- Maven的使用Maven
- Scanner的使用
- @ModelAttribute 的使用