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();
}
}
}
}