源码6:Toggle 和 ToggleGroup

Toggle

public class Toggle : Selectable, IPointerClickHandler, ISubmitHandler, ICanvasElement
{/// <summary>/// Display settings for when a toggle is activated or deactivated./// </summary>public enum ToggleTransition{/// <summary>/// Show / hide the toggle instantly/// </summary>None,/// <summary>/// Fade the toggle in / out smoothly./// </summary>Fade}[Serializable]/// <summary>/// UnityEvent callback for when a toggle is toggled./// </summary>public class ToggleEvent : UnityEvent<bool>{}/// <summary>/// Transition mode for the toggle./// </summary>public ToggleTransition toggleTransition = ToggleTransition.Fade;/// <summary>/// Graphic the toggle should be working with./// </summary>public Graphic graphic;[SerializeField]private ToggleGroup m_Group;/// <summary>/// Group the toggle belongs to./// </summary>public ToggleGroup group{get { return m_Group; }set{SetToggleGroup(value, true);PlayEffect(true);}}/// <summary>/// Allow for delegate-based subscriptions for faster events than 'eventReceiver', and allowing for multiple receivers./// </summary>public ToggleEvent onValueChanged = new ToggleEvent();// Whether the toggle is on[Tooltip("Is the toggle currently on or off?")][SerializeField]private bool m_IsOn;...}

Toggle继承了Selectable, IPointerClickHandler, ISubmitHandler, ICanvasElement,(ICanvasElement,是Canvas渲染的时候调用的接口,后面文章再分析),Toggle有个重要的bool变量m_IsOn(对应成员属性IsOn),表示是否被勾选。还添加了一个UnityEvent类型的事件onValueChanged,用于外部监听m_IsOn是否改变。

IPointerClickHandler 和 ISubmitHandler 响应方式和Button一样 这里看下具体响应后具体做了什么

        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, bool sendCallback = true){if (m_IsOn == value)return;// if we are in a group and set to true, do group logicm_IsOn = value;if (m_Group != null && m_Group.isActiveAndEnabled && IsActive()){if (m_IsOn || (!m_Group.AnyTogglesOn() && !m_Group.allowSwitchOff)){m_IsOn = true;m_Group.NotifyToggleOn(this, sendCallback);}}// 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);}}/// <summary>/// Play the appropriate effect./// </summary>private void PlayEffect(bool instant){if (graphic == null)return;#if UNITY_EDITORif (!Application.isPlaying)graphic.canvasRenderer.SetAlpha(m_IsOn ? 1f : 0f);else
#endifgraphic.CrossFadeAlpha(m_IsOn ? 1f : 0f, instant ? 0f : 0.1f, true);}

可以看到点击后主要是设置m_IsOn状态 如果当前Toggle设置了ToggleGroup就会将当前状态通知到ToggleGroup 里 。 然后执行状态改变的表现 执行onValueChanged事件


    private void SetToggleGroup(ToggleGroup newGroup, bool setMemberValue){// 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 && isOn && IsActive())

这里是设置Toggle的ToggleGroup 在设置的时候有时候样根据当前Toggle的状态 通知到所有是当前ToggleGroup的Toggle进行状态改变

ToggleGroup

ToogleGroup 顾名思义是给Toggle打一个组 当当前Group下的某个Toggle状态改变时,组内其他Toggle也需要改变状态

public class ToggleGroup : UIBehaviour
{[SerializeField] private bool m_AllowSwitchOff = false;/// <summary>/// Is it allowed that no toggle is switched on?/// </summary>/// <remarks>/// If this setting is enabled, pressing the toggle that is currently switched on will switch it off, so that no toggle is switched on. If this setting is disabled, pressing the toggle that is currently switched on will not change its state./// Note that even if allowSwitchOff is false, the Toggle Group will not enforce its constraint right away if no toggles in the group are switched on when the scene is loaded or when the group is instantiated. It will only prevent the user from switching a toggle off./// </remarks>public bool allowSwitchOff { get { return m_AllowSwitchOff; } set { m_AllowSwitchOff = value; } }protected List<Toggle> m_Toggles = new List<Toggle>();...
}

m_Toggles 时记录有当前Group下的Toggle

allowSwitchOff | m_AllowSwitchOff 是否允许关闭所有Toggle。正常情况下一个m_Toggles 列表里 总是会有一个Toggle的状态为True 。但是有些时候也可能需要所有的都为Fasle


    /// <summary>/// Ensure that the toggle group still has a valid state. This is only relevant when a ToggleGroup is Started/// or a Toggle has been deleted from the group./// </summary>public void EnsureValidState(){if (!allowSwitchOff && !AnyTogglesOn() && m_Toggles.Count != 0){m_Toggles[0].isOn = true;NotifyToggleOn(m_Toggles[0]);}IEnumerable<Toggle> activeToggles = ActiveToggles();if (activeToggles.Count() > 1){Toggle firstActive = GetFirstActiveToggle();foreach (Toggle toggle in activeToggles){if (toggle == firstActive){continue;}toggle.isOn = false;}}}

初始化状态 默认是将除第一个Toggle外 其他所有Toggle都置为False 。


    /// <summary>/// Notify the group that the given toggle is enabled./// </summary>/// <param name="toggle">The toggle that got triggered on.</param>/// <param name="sendCallback">If other toggles should send onValueChanged.</param>public void NotifyToggleOn(Toggle toggle, bool sendCallback = true){ValidateToggleIsInGroup(toggle);// disable all toggles in the groupfor (var i = 0; i < m_Toggles.Count; i++){if (m_Toggles[i] == toggle)continue;if (sendCallback)m_Toggles[i].isOn = false;elsem_Toggles[i].SetIsOnWithoutNotify(false);}}

这个方法是将除了输入的Toggle之外所有的Toggle都关闭(isOn = false)

UIGU源码分析6:Toggle 和 ToggleGroup相关推荐

  1. UIGU源码分析1:EventSystem

    源码1:EventSystem private List<BaseInputModule> m_SystemInputModules = new List<BaseInputModu ...

  2. UIGU源码分析7:Scrollbar

    源码7:Scrollbar public class Scrollbar : Selectable, IBeginDragHandler, IDragHandler, IInitializePoten ...

  3. UGUI源码分析:开关组件Toggle与ToggleGroup

    系列 UGUI源码分析系列总览 相关前置: UGUI EventSystem源码分析 UGUI源码分析:Selectable交互组件的基类 文章目录 系列 Toggle Toggle组件属性介绍 初始 ...

  4. s-sgdisk源码分析 “--set-alignment=value分区对齐参数”

    文章目录 边界对齐子命令使用 源码分析 sgdisk.cc main函数入口 gptcl.cc DoOptions解析并执行具体命令函数 gpt.cc CreatePartition创建分区函数,设置 ...

  5. 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析

    [Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...

  6. Android 音频源码分析——音量调节流程

    源码分析基于android9.0 一.声音类型 对于大多数手机用户来说,操作手机音量按键可以看到,声音类型分为四种:媒体.铃声.闹钟.通话,但是其系统内部则分为十几种类型. 声⾳类型用来区分不同播放用 ...

  7. Bootstrap导航栏navbar源码分析

    1.本文目地:分析bootstrap导航栏及其响应式的实现方式,提升自身css水平 先贴一个bootstrap的导航栏模板 http://v3.bootcss.com/examples/navbar- ...

  8. 【分析笔记】Linux gpio_wdt.c 看门狗设备驱动源码分析

    基本原理 该看门狗的设备驱动实现原理很简单,比较主要的有两点: 一.定时器喂狗 通过定时器根据配置文件配置的喂狗方式(如脉冲切换.电平切换),对指定的 gpio 进行脉冲切换或电平切换实现喂狗. 脉冲 ...

  9. Eoe客户端源码分析---SlidingMenu的使用

    Eoe客户端源码分析及代码注释 使用滑动菜单SlidingMenu,单击滑动菜单的不同选项,可以通过ViewPager和PagerIndicator显示对应的数据内容. 0  BaseSlidingF ...

最新文章

  1. POJ 3040 贪心
  2. Mysql 获取当月和上个月第一天和最后一天的解决方案
  3. 阿里巴巴是如何管理测试环境的?
  4. mysql数据库上传ftp服务器中_备份部分mysql表并上传至指定ftp服务器目录中
  5. oracle 0值处理判断,ORACLE数据统计0的处理
  6. SAP云平台CloudFoundry环境里route 超过quota的错误处理
  7. Putty(菩提)远程连接服务器教程
  8. Golang 词法分析器浅析
  9. C#.Net 中的 new 的几个用法
  10. 5.网络层(3)---路由选择协议
  11. H5手机转盘抽奖活动游戏页面源码
  12. fclose用法matlab,fclose和close之间的区别
  13. 前端面试题 Doctype作用是什么?严格模式与混杂模式如何区分?他们之间有何意义?
  14. SDY2205使用说明书
  15. JavaScript将List转Tree
  16. 图片怎么做雕刻路径_精雕图怎么做路径
  17. flutter 运行失败 The SDK directory 'xxxxx' does not exist.
  18. 模切行业选择ERP系统的方案
  19. Godot3游戏引擎入门之零一:【翻译】为什么要选择 Godot 引擎
  20. Flink新特性之非对齐检查点(unaligned checkpoint)简介

热门文章

  1. mac pro 触摸板按住选中失效
  2. 计算机桌面有去不掉的框,电脑屏幕有残留刷新去不掉怎么办
  3. 中国求职招聘人才类网站排行榜
  4. Java JDK1.6下载
  5. 智力考验看成语猜古诗句微信小程序源码
  6. PDF maker文件遗失
  7. 【.net】利用FFmpeg获取视频截图
  8. 室内定位系统方案|蓝牙定位与UWB(超宽带)定位的区别
  9. python label textvariable_PythonTkinter buttons用于设置label textvariable issu的命令
  10. Java获取任务管理器内存、各磁盘内存、CPU使用率数据