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