You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.8 KiB
122 lines
3.8 KiB
3 years ago
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|