protected bool CanHandleEvent(EventTriggerType _nID, GameObject _specGO) { switch (_nID) { case EventTriggerType.PointerUp: return(ExecuteEvents.CanHandleEvent <IPointerUpHandler>(_specGO)); case EventTriggerType.PointerDown: return(ExecuteEvents.CanHandleEvent <IPointerDownHandler>(_specGO)); case EventTriggerType.PointerClick: return(ExecuteEvents.CanHandleEvent <IPointerClickHandler>(_specGO)); default: Debug.LogWarning("目前能冒泡的事件只使用Up,Down,Click事件"); break; } return(false); }
public static GameObject GetEventHandler <T>(GameObject root) where T : IEventSystemHandler { GameObject result; if (root == null) { result = null; } else { Transform transform = root.transform; while (transform != null) { if (ExecuteEvents.CanHandleEvent <T>(transform.gameObject)) { return(transform.gameObject); } transform = transform.parent; } result = null; } return(result); }
protected override void ProcessDrag(PointerEventData pointerEvent) { /* used in StandaloneInputModule.ProcessToucheEvents() and StandaloneInputModule.ProcessMouseEvent(int id) * call OnBeginDrag * call OnPointerUp, if for some reason pointerPress != pointerDrag * call OnDrag * * pointerDrag could be DragHandler, HorizontalDragHandler, or VerticalDragHandler */ if (pointerEvent.IsPointerMoving() && Cursor.lockState != CursorLockMode.Locked && !(pointerEvent.pointerDrag == null)) { if (!pointerEvent.dragging && ShouldStartDrag(pointerEvent.pressPosition, pointerEvent.position, (float)base.eventSystem.pixelDragThreshold, pointerEvent.useDragThreshold)) { ExecuteEvents.Execute <IBeginDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.beginDragHandler); pointerEvent.dragging = true; } if (pointerEvent.dragging) { // if (pointerEvent.pointerPress != pointerEvent.pointerDrag) // { // ExecuteEvents.Execute<IPointerUpHandler>(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler); // pointerEvent.pointerPress = null; // pointerEvent.eligibleForClick = false; // pointerEvent.rawPointerPress = null; // } print("pointerDrag is " + pointerEvent.pointerDrag.gameObject.name); if (!ExecuteEvents.CanHandleEvent <IHorizontalDragHandler>(pointerEvent.pointerDrag) && !ExecuteEvents.CanHandleEvent <IVerticalDragHandler>(pointerEvent.pointerDrag) && ExecuteEvents.CanHandleEvent <IDragHandler>(pointerEvent.pointerDrag)) { ExecuteEvents.Execute <IDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.dragHandler); } else { float thresh = (float)base.eventSystem.pixelDragThreshold; if (pointerEvent.delta.sqrMagnitude > (thresh * thresh)) { if (Mathf.Abs(Vector2.Dot(Vector2.right, pointerEvent.delta.normalized)) > Mathf.Cos(45f * Mathf.Deg2Rad)) { if (ExecuteEvents.CanHandleEvent <IHorizontalDragHandler>(pointerEvent.pointerDrag)) { ExecuteEvents.Execute <IHorizontalDragHandler>(pointerEvent.pointerDrag, pointerEvent, CustomEvents.horizontalDragHandler); } else { GameObject prevPointerDrag = pointerEvent.pointerDrag; pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler <IHorizontalDragHandler>(pointerEvent.pointerCurrentRaycast.gameObject); if (pointerEvent.pointerDrag != null) { // print("switch to h"); ExecuteEvents.Execute <IEndDragHandler>(prevPointerDrag, pointerEvent, ExecuteEvents.endDragHandler); ExecuteEvents.Execute <IInitializePotentialDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag); ExecuteEvents.Execute <IBeginDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.beginDragHandler); ExecuteEvents.Execute <IHorizontalDragHandler>(pointerEvent.pointerDrag, pointerEvent, CustomEvents.horizontalDragHandler); } else { // print("no handler for h"); pointerEvent.pointerDrag = prevPointerDrag; ExecuteEvents.Execute <IDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.dragHandler); } } } else { if (ExecuteEvents.CanHandleEvent <IVerticalDragHandler>(pointerEvent.pointerDrag)) { ExecuteEvents.Execute <IVerticalDragHandler>(pointerEvent.pointerDrag, pointerEvent, CustomEvents.verticalDragHandler); } else { GameObject prevPointerDrag = pointerEvent.pointerDrag; pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler <IVerticalDragHandler>(pointerEvent.pointerCurrentRaycast.gameObject); if (pointerEvent.pointerDrag != null) { // print("switch to v"); ExecuteEvents.Execute <IEndDragHandler>(prevPointerDrag, pointerEvent, ExecuteEvents.endDragHandler); ExecuteEvents.Execute <IInitializePotentialDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag); ExecuteEvents.Execute <IBeginDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.beginDragHandler); ExecuteEvents.Execute <IVerticalDragHandler>(pointerEvent.pointerDrag, pointerEvent, CustomEvents.verticalDragHandler); } else { // print("no handler for v"); pointerEvent.pointerDrag = prevPointerDrag; ExecuteEvents.Execute <IDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.dragHandler); } } } } else { // print("under thresh"); if (Mathf.Abs(Vector2.Dot(Vector2.right, pointerEvent.delta.normalized)) > Mathf.Cos(45f * Mathf.Deg2Rad)) { if (ExecuteEvents.CanHandleEvent <IHorizontalDragHandler>(pointerEvent.pointerDrag)) { ExecuteEvents.Execute <IHorizontalDragHandler>(pointerEvent.pointerDrag, pointerEvent, CustomEvents.horizontalDragHandler); } else { ExecuteEvents.Execute <IDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.dragHandler); } } else { if (ExecuteEvents.CanHandleEvent <IVerticalDragHandler>(pointerEvent.pointerDrag)) { ExecuteEvents.Execute <IVerticalDragHandler>(pointerEvent.pointerDrag, pointerEvent, CustomEvents.verticalDragHandler); } else { ExecuteEvents.Execute <IDragHandler>(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.dragHandler); } } } } prevDelta = pointerEvent.delta; } } }