public void OnDrag(PointerEventData eventData) { int index = eventData.pointerId + TOUCH_MOUSE_OFFSET; if (mPointerStates.Count <= index) { return; } PointerState state = mPointerStates[index]; if (!state.Active) { return; } bool firstDrag = !state.Dragging; state.Dragging = true; Vector2 pos = GetPosition(eventData); Vector2 delta = pos - state.PrevPos; state.PrevPos = pos; PointerState p0, p1; if (GetFirst2ActiveTouch(out p0, out p1) && (p0 == state || p1 == state)) { p0.Dragging = true; p1.Dragging = true; mOnMultiTouchDrag.Invoke(p0.DownPos, p1.DownPos, p0.PrevPos, p1.PrevPos); return; } ePointerType pt = ePointerType.Touch; if (eventData.pointerId < 0) { pt = eventData.pointerId == -2 ? ePointerType.Right : ePointerType.Left; } if (state.DoubleClick == 2) { pt = ePointerType.LeftAndRight; } if (firstDrag) { if (state.DoubleClick > 0) { (state.LongPress == 1 ? mOnDoubleClickLongPressDragStart : mOnDoubleClickDragStart).Invoke(state.DownPos, pt); } else { (state.LongPress == 1 ? mOnLongPressDragStart : mOnDragStart).Invoke(state.DownPos, pt); } } if (state.DoubleClick > 0) { (state.LongPress == 1 ? mOnDoubleClickLongPressDragging : mOnDoubleClickDragging).Invoke(state.DownPos, delta, pt); } else { (state.LongPress == 1 ? mOnLongPressDragging : mOnDragging).Invoke(state.DownPos, delta, pt); } }
void Update() { int activeCount = 0; int activeIndex = -1; for (int i = mPointerStates.Count - 1; i >= 0; i--) { if (mPointerStates[i].Active) { activeCount++; activeIndex = i; } } if (activeCount != 1) { return; } PointerState state = mPointerStates[activeIndex]; if (!state.Active || state.LongPress != 0 || state.Dragging) { return; } if ((DateTime.UtcNow - state.DownTime).TotalSeconds > LONG_PRESS_START) { state.LongPress = 1; ePointerType pt = ePointerType.Touch; switch (activeIndex - TOUCH_MOUSE_OFFSET) { case -1: pt = ePointerType.Left; break; case -2: pt = ePointerType.Right; break; } if (state.DoubleClick == 2) { pt = ePointerType.LeftAndRight; } (state.DoubleClick > 0 ? mOnLongPress2 : mOnLongPress).Invoke(state.DownPos, pt); } }
public void OnPointerUp(PointerEventData eventData) { if (mPointerStates.Count <= eventData.pointerId + TOUCH_MOUSE_OFFSET) { return; } int index = eventData.pointerId + TOUCH_MOUSE_OFFSET; PointerState state = mPointerStates[index]; PointerState p0, p1; if (GetFirst2ActiveTouch(out p0, out p1) && (state == p0 || state == p1)) { mOnMultiTouchEnd.Invoke(p0.DownPos, p1.DownPos, p0.PrevPos, p1.PrevPos); } if (!state.Active) { return; } state.Active = false; Vector2 pos = GetPosition(eventData); ePointerType pt = ePointerType.Touch; if (eventData.pointerId < 0) { pt = eventData.pointerId == -2 ? ePointerType.Right : ePointerType.Left; } if (state.DoubleClick == 2) { pt = ePointerType.LeftAndRight; for (int i = mPointerStates.Count - 1; i >= 0; i--) { if (i == index) { continue; } PointerState ps = mPointerStates[i]; if (!ps.Active) { continue; } if (ps.DoubleClick == 2) { ps.Active = false; } } } if (state.Dragging) { if (state.DoubleClick > 0) { (state.LongPress == 1 ? mOnDoubleClickLongPressDragEnd : mOnDoubleClickDragEnd).Invoke(state.DownPos, pos, pt); } else { (state.LongPress == 1 ? mOnLongPressDragEnd : mOnDragEnd).Invoke(state.DownPos, pos, pt); } } else { if (state.DoubleClick > 0) { (state.LongPress == 1 ? mOnDoubleLongPressClick : mOnDoubleClick).Invoke(state.DownPos, pt); } else { (state.LongPress == 1 ? mOnLongPressClick : mOnClick).Invoke(state.DownPos, pt); } } if (GetFirst2ActiveTouch(out p0, out p1) && (state == p0 || state == p1)) { p0.DownPos = p0.PrevPos; p1.DownPos = p1.PrevPos; p0.LongPress = -1; p1.LongPress = -1; mOnMultiTouchBegin.Invoke(p0.DownPos, p1.DownPos); } }
public void OnPointerDown(PointerEventData eventData) { DateTime now = DateTime.UtcNow; Vector2 pos = GetPosition(eventData); int index = eventData.pointerId + TOUCH_MOUSE_OFFSET; int cellId = OnTouchDown == null ? -1 : OnTouchDown(pos); int isDoubleClick = 0; for (int i = mPointerStates.Count - 1; i >= 0; i--) { PointerState ps = mPointerStates[i]; if (ps.DoubleClick > 0 || ps.Dragging) { continue; } if ((now - ps.DownTime).TotalSeconds > DOUBLE_CLICK_MAX_INTERVAL) { continue; } if (cellId >= 0) { if (cellId != ps.CellId) { continue; } } else { if ((ps.DownPos - pos).sqrMagnitude > m_DoubleClickThreshold * m_DoubleClickThreshold) { continue; } } if (ps.Active) { if (i < TOUCH_MOUSE_OFFSET && index < TOUCH_MOUSE_OFFSET) { isDoubleClick = 2; ps.DoubleClick = 2; } } else { isDoubleClick = 1; } } while (eventData.pointerId + TOUCH_MOUSE_OFFSET >= mPointerStates.Count) { mPointerStates.Add(new PointerState()); } PointerState state = mPointerStates[index]; state.CellId = cellId; state.DoubleClick = isDoubleClick; state.LongPress = 0; state.Dragging = false; state.DownPos = pos; state.PrevPos = pos; state.DownTime = now; state.Active = true; PointerState p0, p1; if (GetFirst2ActiveTouch(out p0, out p1) && (p0 == state || p1 == state)) { state.DoubleClick = 0; state.LongPress = -1; p0.DownPos = p0.PrevPos; p1.DownPos = p1.PrevPos; mOnMultiTouchBegin.Invoke(p0.DownPos, p1.DownPos); } else { ePointerType pt = ePointerType.Touch; if (eventData.pointerId < 0) { pt = eventData.pointerId == -2 ? ePointerType.Right : ePointerType.Left; } mOnPress.Invoke(pos, pt); } }
private void Apply(GameObject go, int i, object data, int row, int column, bool reversed) { if (mOnApply != null) { ePointerType prevDirType = ePointerType.Left; ePointerType nextDirType = ePointerType.Right; if (m_Direction == eDirection.Vertical) { if (reversed) { prevDirType = ePointerType.Right; nextDirType = ePointerType.Left; if (column == 0) { nextDirType = ePointerType.Down; } if (column == mColumns - 1) { prevDirType = ePointerType.Up; } } else { prevDirType = ePointerType.Left; nextDirType = ePointerType.Right; if (column == 0) { prevDirType = m_SnakeLayout ? ePointerType.Up : ePointerType.NewRowOrColumn; } if (column == mColumns - 1) { nextDirType = m_SnakeLayout ? ePointerType.Down : ePointerType.NewRowOrColumn; } } } else { if (reversed) { prevDirType = ePointerType.Down; nextDirType = ePointerType.Up; if (row == 0) { nextDirType = ePointerType.Right; } if (row == mRows - 1) { prevDirType = ePointerType.Left; } } else { prevDirType = ePointerType.Up; nextDirType = ePointerType.Down; if (row == 0) { prevDirType = m_SnakeLayout ? ePointerType.Left : ePointerType.NewRowOrColumn; } if (row == mRows - 1) { nextDirType = m_SnakeLayout ? ePointerType.Right : ePointerType.NewRowOrColumn; } } } if (i == 0) { prevDirType = ePointerType.None; } if (i == mDatas.Length - 1) { nextDirType = ePointerType.None; } try { mOnApply(go, i, data, prevDirType, nextDirType); } catch (System.Exception e) { Debug.LogException(e); } } }