UGUI源码解析(十二)Dropdown

Dropdown

内部类DropdownItem,继承自MonoBehaviour和IPointerEnterHandler, ICancelHandler两个接口。

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

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

Dropdown继承了Selectable, IPointerClickHandler, ISubmitHandler, ICancelHandler。

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

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

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

OnPointerClick(继承自IPointerClickHandler,点击时)和OnSubmit(继承自ISubmitHandler,确认键按下时)调用了Show方法,而ICancelHandler(继承自ICancelHandler,取消键按下时)调用了Hide方法。

Show方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值