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