按钮拖拽组件
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;
// 拖动事件回调
namespace ETModel
{
public class DragCallback
{
public delegate void DragDelegate(PointerEventData eventData);
private List<DragDelegate> m_Listener = new List<DragDelegate>();
public void Add(DragDelegate drag)
{
if (m_Listener.Contains(drag))
{
return;
}
m_Listener.Add(drag);
}
public void Remove(DragDelegate drag)
{
m_Listener.Remove(drag);
}
public void RemoveAll()
{
m_Listener.Clear();
}
public void Invoke(PointerEventData eventData)
{
for (int i = 0; i < m_Listener.Count; i++)
{
m_Listener[i].Invoke(eventData);
}
}
}
// 按钮拖拽组件
public class ButtonDragComponent : Button, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public DragCallback onBeginDrag;
public DragCallback onDrag;
public DragCallback onEndDrag;
// public ScrollRect ScrollRect;
// public static bool StopScroll;
override protected void Awake()
{
// StopScroll = false;
onBeginDrag = new DragCallback();
onDrag = new DragCallback();
onEndDrag = new DragCallback();
}
// 开始拖拽
public void OnBeginDrag(PointerEventData eventData)
{
/* PointerEventData.position: 以屏幕左下角为原点的坐标, 拖拽出组件范围仍可用*/
// if (ScrollRect != null)
// ScrollRect.OnBeginDrag(eventData);
onBeginDrag?.Invoke(eventData);
}
// 拖拽中
public void OnDrag(PointerEventData eventData)
{
// if (ScrollRect != null && !StopScroll)
// ScrollRect.OnDrag(eventData);
// else if(ScrollRect != null && StopScroll)
// ScrollRect.OnEndDrag(eventData);
onDrag?.Invoke(eventData);
}
// 结束拖拽
public void OnEndDrag(PointerEventData eventData)
{
// if (ScrollRect != null && !StopScroll)
// ScrollRect.OnEndDrag(eventData);
// StopScroll = false;
onEndDrag?.Invoke(eventData);
}
}
}
因为滚动视图中应该是实现了拖拽接口,上面的可拖拽按钮拦截了滚动视图的滑动,所以导致滚动视图无法滑动,为了解决这个问题,由于百度能力有限,找了半天找不到我想要的东西就自己简单写了个解决方案。
代码中“//”注释的代码段是对可拖拽按钮的修改,UI如果在ScrollRect下实例出来,则通过GetComponent方法将根目录下的ScrollRect组件赋值给ButtonDragComponent 组件的ScrollRect变量,这样可拖拽按钮和滚动视图都可拖动。
除此之外,如果要实现某种情况下,滚动视图停止滑动,但可拖拽按钮的拖拽不停止的需求,可以修改静态字段StopScroll的值。