示例#1
0
        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);
            }
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
            }
        }
示例#5
0
 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); }
     }
 }