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列表
相關文章
- RecyclerView用法和原始碼深度解析View原始碼
- HandlerThread和IntentService原始碼解析threadIntent原始碼
- RxBinding使用和原始碼解析原始碼
- Picasso的使用和原始碼解析原始碼
- EventBus的使用和原始碼解析原始碼
- 【UGUI原始碼分析】Unity遮罩之Mask詳細解讀UGUI原始碼Unity遮罩
- Glide原始碼解析四(解碼和轉碼)IDE原始碼
- 【原始碼解析】- ArrayList原始碼解析,絕對詳細原始碼
- HashMap原始碼解析和設計解讀HashMap原始碼
- Binder的使用方法和原始碼解析原始碼
- Retrofit2使用方式和原始碼解析原始碼
- Spark原始碼-SparkContext原始碼解析Spark原始碼Context
- CountDownLatch原始碼解析CountDownLatch原始碼
- LeakCanary原始碼解析原始碼
- vuex原始碼解析Vue原始碼
- ArrayBlockQueue原始碼解析BloC原始碼
- AsyncTask原始碼解析原始碼
- CopyOnWriteArrayList原始碼解析原始碼
- Express原始碼解析Express原始碼
- Observer原始碼解析Server原始碼
- SparseArray 原始碼解析原始碼
- RecyclerView原始碼解析View原始碼
- Promise 原始碼解析Promise原始碼
- Koa原始碼解析原始碼
- RateLimiter原始碼解析MIT原始碼
- redux原始碼解析Redux原始碼
- SDWebImage原始碼解析Web原始碼
- CyclicBarrier原始碼解析原始碼
- Semaphore原始碼解析原始碼
- Exchanger原始碼解析原始碼
- AbstractQueuedSynchronizer原始碼解析原始碼
- OKio原始碼解析原始碼
- Koa 原始碼解析原始碼
- RxPermission原始碼解析原始碼
- MyBatis原始碼解析MyBatis原始碼
- ArrayList原始碼解析原始碼
- Aspects 原始碼解析原始碼
- LeakCanary 原始碼解析原始碼