UGUI源码分析:Scrollbar与ScrollRect滑动列表组件

本文详细分析了Unity的UGUI中ScrollRect和Scrollbar组件的源码,包括它们的属性、接口和实现原理。着重讨论了Scrollbar的拖拽交互和ScrollRect的滑动条、拖拽及滚轮交互。通过对这些组件的工作机制的理解,有助于更好地掌握UGUI中的滑动列表功能。
摘要由CSDN通过智能技术生成

系列

UGUI源码分析系列总览
相关前置:
UGUI EventSystem源码分析
UGUI源码分析:Selectable交互组件的基类


UML图一览

在这里插入图片描述
UGUI中的滑动组件主要由ScrollRect与Scrollbar构成,首先先简单介绍以下Scrollbar组件的实现原理。

Scrollbar

BaseClass: Selectable

Interface: IInitializePotentialDragHandler,IBeginDragHandler,IDragHandler,ICanvasElement

Intro: UGUI中滚动条组件

  • initializePotentialDrag:提前告知可能触发拖拽的接口
  • IXXXDragHandler:三个拖拽接口
  • ICanvasElement: Canvas重建接口,当Canvas发生更新时执行重建操作

属性介绍

在这里插入图片描述

  • Interactable:是否可被交互(false时无法通过EventSystem进行交互)
  • Transition:状态变化过渡模式(相关详情
  • Navigation:导航(相关详情)
  • Handle Rect :可滑动的部分
  • Direction :滑动方向
  • Value :滑动条当前值(0~1之间)
  • Size :Handle的尺寸
  • NumberOfSteps :大于1时代表把bar分成Step-1份

实现

Scrollbar组件的实现原理:通过拖拽事件、点击事件、移动按键来控制滚动条在一定区域中移动,并计算位于该区域中(0~1)之间的值value。

拖拽原理类似于ScrollRect,这个我们具体在ScrollRect中进行分析。

点击交互: 发生点击交互时,会根据点击位置启动一个携程来进行位置更新。

public override void OnPointerDown(PointerEventData eventData)
{
   
    //如果是要进行拖拽了那就没事了:)
    if (!MayDrag(eventData))
        return;
    base.OnPointerDown(eventData);//执行Selectable基类方法
    isPointerDownAndNotDragging = true; //标记状态
    m_PointerDownRepeat = StartCoroutine(ClickRepeat(eventData)); //启动变化携程
}
protected IEnumerator ClickRepeat(PointerEventData eventData)
{
   
    //当抬起操作时则此循环结束
    while (isPointerDownAndNotDragging)
    {
   
        if (!RectTransformUtility.RectangleContainsScreenPoint(m_HandleRect, eventData.position, eventData.enterEventCamera))
        {
   
            Vector2 localMousePos;
            //获取鼠标点击位于HandleRect的本地坐标
            if (RectTransformUtility.ScreenPointToLocalPointInRectangle(m_HandleRect, eventData.position, eventData.pressEventCamera, out localMousePos))
            {
   
                //根据轴变化value值,频率取决于size大小
                var axisCoordinate = axis == 0 ? localMousePos.x : localMousePos.y;
                if (axisCoordinate < 0)
                    value -= size;
                else
                    value += size;
            }
        }
        yield return new WaitForEndOfFrame();
    }
    StopCoroutine(m_PointerDownRepeat);
}

到此,Scrollbar组件基本详情已经了解清楚了,因为在日常开发中,Scrollbar经常是与ScrollRect组件一同使用构成滑动列表的(Scroll View),所以我们重点对于ScrollRect进行分析。


ScrollRect

BaseClass: UIBehaviour

Interface: IInitializePotentialDragHandler,IXXXDragHandler,IScrollHandler,ICanvasElement,ILayoutElement,ILayoutGroup

Intro: UGUI中滑动列表组件

  • initializePotentialDrag:提前告知可能触发拖拽的接口,这个接口只有在存在IDragHandler接口时才会触发,当点击或触碰时便触发了(会发生在BeginDrag之前
  • IXXXDragHandler:三个拖拽接口,这里就简写成这样,监听整个拖拽过程(开始,拖拽,结束)。
  • IScrollHandler: 鼠标中间滚动事件接口
  • ICanvasElement: Canvas重建接口,当Canvas发生更新时执行重建操作
  • ILayoutElement&ILayoutGroup:布局相关接口

ScrollRect,是UGUI中滑动列表功能时经常被使用的组件。它提供了水平和垂直两种滑动模式,配合Scrollbar组件经常被用于UI制作。

属性介绍

在这里插入图片描述

  • Content :滚动区域
  • Horizontal :水平滚动开关
  • Vertical:垂直滚动开关
  • MovementType :移动模
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值