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