ScrollRect滑动优化(一)

来源:互联网 发布:电脑壁纸软件哪个好 编辑:程序博客网 时间:2024/06/05 21:57

Unity各个组件结构如下:









动态生成的item如下:



主要是重写了Scroll View中的ScrollRect的方法,item就生成在Content中,注意要和Layout Element同时使用,

效果比原生的要好,删除单个item的时候item表会自动排列,以及其他....
ScrollRectEx的代码就贴在下面了

using UnityEngine;using System.Collections;using UnityEngine.UI;using System;using UnityEngine.EventSystems;using UnityEngine.Events;public class ScrollRectEx : ScrollRect{    private bool routeToParent = false;    public class ScrollEndEvent : UnityEvent    {    }    public ScrollEndEvent onScrollTop = new ScrollEndEvent();    public ScrollEndEvent onScrollBottom = new ScrollEndEvent();    public ScrollEndEvent onScrollLeft = new ScrollEndEvent();    public ScrollEndEvent onScrollRight = new ScrollEndEvent();    /// <summary>    /// Do action for all parents    /// </summary>    private void DoForParents<T>(Action<T> action) where T : IEventSystemHandler    {        Transform parent = transform.parent;        while (parent != null)        {            foreach (var component in parent.GetComponents<Component>())            {                if (component is T)                    action((T)(IEventSystemHandler)component);            }            parent = parent.parent;        }    }    /// <summary>    /// Always route initialize potential drag event to parents    /// </summary>    public override void OnInitializePotentialDrag(PointerEventData eventData)    {        DoForParents<IInitializePotentialDragHandler>((parent) => { parent.OnInitializePotentialDrag(eventData); });        base.OnInitializePotentialDrag(eventData);    }    /// <summary>    /// Drag event    /// </summary>    public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData)    {        if (routeToParent)            DoForParents<IDragHandler>((parent) => { parent.OnDrag(eventData); });        else            base.OnDrag(eventData);    }    /// <summary>    /// Begin drag event    /// </summary>    public override void OnBeginDrag(UnityEngine.EventSystems.PointerEventData eventData)    {        if (!horizontal && Math.Abs(eventData.delta.x) > Math.Abs(eventData.delta.y))            routeToParent = true;        else if (!vertical && Math.Abs(eventData.delta.x) < Math.Abs(eventData.delta.y))            routeToParent = true;        else            routeToParent = false;        if (routeToParent)            DoForParents<IBeginDragHandler>((parent) => { parent.OnBeginDrag(eventData); });        else            base.OnBeginDrag(eventData);    }    /// <summary>    /// End drag event    /// </summary>    public override void OnEndDrag(UnityEngine.EventSystems.PointerEventData eventData)    {        if (routeToParent)            DoForParents<IEndDragHandler>((parent) => { parent.OnEndDrag(eventData); });        else            base.OnEndDrag(eventData);        routeToParent = false;    }    public virtual void Update()    {        if(normalizedPosition.y > 1.0f)        {            if(onScrollTop != null)            {                onScrollTop.Invoke();            }        }        if (normalizedPosition.y < 0.0f)        {            if (onScrollBottom != null)            {                onScrollBottom.Invoke();            }        }        if (normalizedPosition.x > 1.0f)        {            if (onScrollLeft != null)            {                onScrollLeft.Invoke();            }        }        if (normalizedPosition.x < 0.0f)        {            if (onScrollRight != null)            {                onScrollRight.Invoke();            }        }    }}


原创粉丝点击