UGUI原始碼解析(Toggle和ToggleGroup)
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
OnPointerClick和OnSubmit會呼叫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列表
相關文章
- HandlerThread和IntentService原始碼解析threadIntent原始碼
- 【UGUI原始碼分析】Unity遮罩之Mask詳細解讀UGUI原始碼Unity遮罩
- RecyclerView用法和原始碼深度解析View原始碼
- Glide原始碼解析四(解碼和轉碼)IDE原始碼
- Spring原始碼解析02:Spring IOC容器之XmlBeanFactory啟動流程分析和原始碼解析Spring原始碼XMLBean
- ToggleGroup的使用
- Java Timer原始碼解析(定時器原始碼解析)Java原始碼定時器
- 【原始碼解析】- ArrayList原始碼解析,絕對詳細原始碼
- Spring @Profile註解使用和原始碼解析Spring原始碼
- [原始碼解析] GroupReduce,GroupCombine 和 Flink SQL group by原始碼SQL
- HashMap原始碼解析和設計解讀HashMap原始碼
- 【UGUI原始碼分析】Unity遮罩之RectMask2D詳細解讀UGUI原始碼Unity遮罩
- JavaScript toggle()JavaScript
- Spark SQL原始碼解析(四)Optimization和Physical Planning階段解析SparkSQL原始碼
- ReactNative原始碼解析-初識原始碼React原始碼
- Koa 原始碼解析原始碼
- Koa原始碼解析原始碼
- RxPermission原始碼解析原始碼
- Express原始碼解析Express原始碼
- redux原始碼解析Redux原始碼
- CopyOnWriteArrayList原始碼解析原始碼
- LeakCanary原始碼解析原始碼
- ArrayBlockQueue原始碼解析BloC原始碼
- ReentrantLock原始碼解析ReentrantLock原始碼
- OKio原始碼解析原始碼
- ReentrantReadWriteLock原始碼解析原始碼
- CyclicBarrier原始碼解析原始碼
- Semaphore原始碼解析原始碼
- Exchanger原始碼解析原始碼
- SDWebImage原始碼解析Web原始碼
- AbstractQueuedSynchronizer原始碼解析原始碼
- LinkedList原始碼解析原始碼
- HandlerThread原始碼解析thread原始碼
- ButterKnife原始碼解析原始碼
- SpringMVC原始碼解析SpringMVC原始碼
- RecyclerView原始碼解析View原始碼
- MyBatis原始碼解析MyBatis原始碼
- CountDownLatch原始碼解析CountDownLatch原始碼