129 lines
4.0 KiB
C#
129 lines
4.0 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace FairyGUI
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Helper for drag and drop.
|
|||
|
/// 这是一个提供特殊拖放功能的功能类。与GObject.draggable不同,拖动开始后,他使用一个替代的图标作为拖动对象。
|
|||
|
/// 当玩家释放鼠标/手指,目标组件会发出一个onDrop事件。
|
|||
|
/// </summary>
|
|||
|
public class DragDropManager
|
|||
|
{
|
|||
|
private GLoader _agent;
|
|||
|
private object _sourceData;
|
|||
|
private GObject _source;
|
|||
|
|
|||
|
private static DragDropManager _inst;
|
|||
|
public static DragDropManager inst
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_inst == null)
|
|||
|
_inst = new DragDropManager();
|
|||
|
return _inst;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if UNITY_2019_3_OR_NEWER
|
|||
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
|
|||
|
static void InitializeOnLoad()
|
|||
|
{
|
|||
|
_inst = null;
|
|||
|
}
|
|||
|
#endif
|
|||
|
public DragDropManager()
|
|||
|
{
|
|||
|
_agent = (GLoader)UIObjectFactory.NewObject(ObjectType.Loader);
|
|||
|
_agent.gameObjectName = "DragDropAgent";
|
|||
|
_agent.SetHome(GRoot.inst);
|
|||
|
_agent.touchable = false;//important
|
|||
|
_agent.draggable = true;
|
|||
|
_agent.SetSize(100, 100);
|
|||
|
_agent.SetPivot(0.5f, 0.5f, true);
|
|||
|
_agent.align = AlignType.Center;
|
|||
|
_agent.verticalAlign = VertAlignType.Middle;
|
|||
|
_agent.sortingOrder = int.MaxValue;
|
|||
|
_agent.onDragEnd.Add(__dragEnd);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Loader object for real dragging.
|
|||
|
/// 用于实际拖动的Loader对象。你可以根据实际情况设置loader的大小,对齐等。
|
|||
|
/// </summary>
|
|||
|
public GLoader dragAgent
|
|||
|
{
|
|||
|
get { return _agent; }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Is dragging?
|
|||
|
/// 返回当前是否正在拖动。
|
|||
|
/// </summary>
|
|||
|
public bool dragging
|
|||
|
{
|
|||
|
get { return _agent.parent != null; }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Start dragging.
|
|||
|
/// 开始拖动。
|
|||
|
/// </summary>
|
|||
|
/// <param name="source">Source object. This is the object which initiated the dragging.</param>
|
|||
|
/// <param name="icon">Icon to be used as the dragging sign.</param>
|
|||
|
/// <param name="sourceData">Custom data. You can get it in the onDrop event data.</param>
|
|||
|
/// <param name="touchPointID">Copy the touchId from InputEvent to here, if has one.</param>
|
|||
|
public void StartDrag(GObject source, string icon, object sourceData, int touchPointID = -1)
|
|||
|
{
|
|||
|
if (_agent.parent != null)
|
|||
|
return;
|
|||
|
|
|||
|
_sourceData = sourceData;
|
|||
|
_source = source;
|
|||
|
_agent.url = icon;
|
|||
|
GRoot.inst.AddChild(_agent);
|
|||
|
_agent.xy = GRoot.inst.GlobalToLocal(Stage.inst.GetTouchPosition(touchPointID));
|
|||
|
_agent.StartDrag(touchPointID);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Cancel dragging.
|
|||
|
/// 取消拖动。
|
|||
|
/// </summary>
|
|||
|
public void Cancel()
|
|||
|
{
|
|||
|
if (_agent.parent != null)
|
|||
|
{
|
|||
|
_agent.StopDrag();
|
|||
|
GRoot.inst.RemoveChild(_agent);
|
|||
|
_sourceData = null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void __dragEnd(EventContext evt)
|
|||
|
{
|
|||
|
if (_agent.parent == null) //cancelled
|
|||
|
return;
|
|||
|
|
|||
|
GRoot.inst.RemoveChild(_agent);
|
|||
|
|
|||
|
object sourceData = _sourceData;
|
|||
|
GObject source = _source;
|
|||
|
_sourceData = null;
|
|||
|
_source = null;
|
|||
|
|
|||
|
GObject obj = GRoot.inst.touchTarget;
|
|||
|
while (obj != null)
|
|||
|
{
|
|||
|
if (obj.hasEventListeners("onDrop"))
|
|||
|
{
|
|||
|
obj.RequestFocus();
|
|||
|
obj.DispatchEvent("onDrop", sourceData, source);
|
|||
|
return;
|
|||
|
}
|
|||
|
obj = obj.parent;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|