UGUI源码解析(DropDown)

Runtime类图

DropdownItem

内部类DropdownItem,继承自MonoBehaviour和IPointerEnterHandler, ICancelHandler两个接口。内部封装了Toggle、Text、Image组件。

OnPointerEnter(当鼠标进入)方法继承自IPointerEnterHandler,调用EventSystem的SetSelectedGameObject将本对象设置为选中的对象,表现就是Item对象的背景颜色变了。

OnCancel(取消键按下)方法继承自ICancelHandler,获取父对象中的dropdown组件,调用Hide方法。具体表现就是选项表(Dropdown List)隐藏了。

OptionData和OptionDataList

选项数据类,内部字段如下,存储了选项表(Dropdown List)的选项文本和图片精灵。以集合列表的形式封装在OptionDataList中。

private string m_Text;
private Sprite m_Image;

Dropdown

[SerializeField]  private RectTransform m_Template;

用来创建DropdownItem的模板。

[SerializeField] private Text m_CaptionText;

[SerializeField] private Image m_CaptionImage;

用来设置当前显示项的DropdownItem的文本和图片。

 [SerializeField] private Text m_ItemText;

 [SerializeField] private Image m_ItemImage;

用来设置模板项的DropdownItem的。

[SerializeField] private int m_Value;

记录当前选中项的DropdownItem的下标值。


[SerializeField] private OptionDataList m_Options;

选项数据类,在动态创建Dropdown List时赋值相应的数据,包括显示的文本和图片。

[SerializeField] private DropdownEvent m_OnValueChanged;

Dropdown的值更新事件。

value属性

Dropdown的值value是一个属性(Property),对应变量m_Value。它的set访问器里,会将参数值限定在0到options.Count(选项数量) - 1之间。刷新RefreshShownValue,并发送m_OnValueChanged事件。

RefreshShownValue方法

会在options里找到value值对应的OptionData,然后为m_CaptionText设置文本和m_CaptionImage设置图片,即在DropDown上显示选中的选项。

重载AddOptions方法

主要是向 m_Options 添加新的数据项,并调用刷新方法RefreshShownValue。

OnPointerClick,OnSubmit,ICancelHandler

OnPointerClickOnSubmit调用了Show方法,而OnCancel调用了Hide方法。

Show方法

  • 调用SetupTemplate方法,设置模板。为Item添加DropdownItem,为m_Template添加Canvas,设置overrideSorting为true,sortingOrder为30000,为选项表尽可能的显示在前面,然后添加GraphicRaycaster,CanvasGroup组件,为了接受鼠标事件。
  • CreateDropdownList,利用optionData的数据列表实例化DropDown实例,SetParent设置父节点
  • 获得DropdownItem,以DropdownItem为模板创建Item,并填充数据。设置toggle状态,添加toggle的onValueChanged事件。
  • 根据Item的数量设置Content的尺寸,Content是ScrollRect里的内容对象。并且如果DropDownList的高度大于Content的高度,便修正他的高度与Content相同。
  • 然后判断DropDownList的四个角,是否超出了rootCanvas(Dropdown最上层的Canvas)的边界,便翻转DropDownList(DropDownList的四个角超出了rootCanvas的最小值,便往上弹出,否则往下弹出),然后设置Item的位置和尺寸。
  • 调用AlphaFadeList通过调整CanvasGroup的alpha值,渐变显示Dropdown List,并将m_Template和itemTemplate设置为无效的。
  • 调用CreateBlocker创建Blocker。Blocker在rootCanvas下一级,尺寸与rootCanvas相同,sortingOrder比Dropdown List的小1(29999)。添加了Image组件,颜色为全透明,添加了Button组件,添加了onClick的监听,回调Hide方法。由此我们可知道Blocker是用于阻挡住鼠标事件,即Dropdown List显示时,点击选项表以外的区域,都只是隐藏选项表,不会触发其他的组件。

Hide方法,调用AlphaFadeList使得Alpha渐变隐藏Dropdown List,并在渐变结束后开启协程StartCoroutine(DelayedDestroyDropdownList(m_AlphaFadeSpeed))延迟Destroy所有的Item和Dropdown List。接着DestroyBlocker。最后设置本对象为Select(高亮状态)。

重写Awake方法

新建了一个FloatTween类型的TweenRunner变量m_AlphaTweenRunner并初始化,这个变量在显示/隐藏选项表(Dropdown List)的时候执行透明度渐变效果。然后设置了m_CaptionImage是否可用,这个变量对应于编辑器里的Caption Image,如果选中的选项(Options)设置了图片的话,就会使用m_CaptionImage显示在Dropdown的上。设置m_Template为false,这个变量对应于Template对象,用于作为模板实例化选项表。

关于它的更多使用可以参考此文章:

Unity 的 UGUI 组件Dropdown简析_Peter_Gao_的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值