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