UGUI原始碼解析(Toggle和ToggleGroup)

dmk17771552304發表於2021-01-01

Runtime類圖分析

 

Toggle

Toggle繼承了Selectable, IPointerClickHandler, ISubmitHandler, ICanvasElement,(ICanvasElement,是Canvas渲染的時候呼叫的介面)

 

關鍵方法

OnEnable時將自己註冊到ToggleGroup並呼叫PlayEffect。OnDisable時將自己移出ToggleGroup

 

重寫OnDidApplyAnimationProperties,判斷m_IsOn是否被動畫改變(判斷影像的Alpha是否接近零)

 

SetToggleGroup(ToggleGroup newGroup, bool setMemberValue),首先判斷當前Toggle的舊的m_Group是否為空,如果不為空那麼從中移除掉,如果setMemberValue為true,那麼將newGroup的值設定給m_Group快取起來,再呼叫newGroup的RegisterToggle方法,將當前的Toggle註冊進去,在newGroup值不為空且當前的toggle是顯示的狀態下且isOn為true,那麼呼叫newGroup的NotifyToggleOn(this),通知當前的toggle是出於選中態

 

SetIsOnWithoutNotify(bool value)

通過傳入變數value的值,呼叫Set方法,但是不傳送事件

 

Set方法用於設定m_IsOn的值,併傳送事件onValueChanged.Invoke(m_IsOn)。除此之外,Set方法還會呼叫m_Group.NotifyToggleOn(this)。呼叫PlayEffect方法來播放切換效果。

 

PlayEffect,呼叫graphic.CrossFadeAlpha(根據狀態改變/漸變影像的透明度)。

 

Toggle重寫了Start方法,在Start的時候,PlayEffect。

 

InternalToggle,在未隱藏且可互動的條件下,反轉isOn 

 

OnPointerClickOnSubmit會呼叫InternalToggle方法切換Toggle的狀態isOn = !isOn,isOn是Toggle的成員屬性,它的set訪問器會呼叫Toggle的Set成員方法。

 

重要屬性和欄位

m_IsOn

表示是否被勾選

UnityEvent<bool>型別的事件onValueChanged

用於外部監聽m_IsOn是否改變

 

ToggleGroup

ToggleGroup繼承自UIBehaviour,可以將多個Toggle分到一個組裡而保持至多一個Toggle狀態為On。維護了一個ToggleList,用於儲存註冊在該ToggleGroup的所有Toggle。

 

關鍵方法

Toggle在OnEnable的時候註冊到group,OnDisable的時候移出group,另外通過為group屬性賦值也可以讓Toggle註冊到指定的ToggleGroup。

NotifyToggleOn這個方法是將除了輸入的Toggle之外所有的Toggle都關閉(isOn = false)。我們也可以呼叫ToggleGroup的一些方法,例如AnyTogglesOn判斷是否有Toggle開啟(Toggle的set方法也呼叫了這個方法,即沒有任何Toggle開啟且group不允許全部Toggle關閉的時候,強制設為開啟),ActiveToggles獲取開啟的Toggle,SetAllTogglesOff關閉所有Toggle。

 

UnregisterToggle

從toggle的列表中移除指定的toggle,判斷在!allowSwitchOff && !AnyTogglesOn() && m_Toggles.Count != 0,將第一個toggle設定為選中狀態

 

RegisterToggle

往toggle的列表中新增指定的toggle,判斷在!allowSwitchOff && !AnyTogglesOn()的條件下將當前這個toggle設定為選中狀態,同時呼叫NotifyToggleOn通知其他的toggle

 

AnyTogglesOn

判斷toggle Group中的toggle列表中是否有任何一個toggle的isOn為true

 

ActiveToggles

返回獲取toggle Group中的toggle列表中的第一個isOn為true的toggle

 

SetAllTogglesOff(bool sendCallback = true)

設定所有toggle的isOn為false,如果sendCallback 為true,需要傳送當前toggle值改變的事件

 

重要屬性和欄位

m_AllowSwitchOff

是否允許有的toggle處於未選中狀態,如果不勾選,那麼當前的toggle Group中必須得有一個toggle處於選中狀態

private List<Toggle> m_Toggles = new List<Toggle>()

當前toggle Group組下的toggle列表

 

 

相關文章