コード例 #1
0
 void processGestureInMenuSelection(TouchGestureRecognizer.TouchGesture touchGesture)
 {
     if (touchGesture.GestureType == TouchGestureRecognizer.TouchGestureType.SINGLE_TOUCH_DOWN)
     {
         TouchPointerData touchData           = (TouchPointerData)touchGesture.MetaData;
         Vector2          rawLocalTapPos      = new Vector2(touchData.RelX, touchData.RelY);
         Vector2          adjustedLocalTapPos = GlobalUtilities.ConvertMobileRelPosToUnityRelPos(rawLocalTapPos);
         if (menuManipLocalBound.Contains(adjustedLocalTapPos))
         {
             _menuManip.GetComponent <MeshRenderer>().material = menuMaterials[1];
         }
         else if (menuDrawLocalBound.Contains(adjustedLocalTapPos))
         {
             _menuDraw.GetComponent <MeshRenderer>().material = menuMaterials[3];
         }
     }
     else if (touchGesture.GestureType == TouchGestureRecognizer.TouchGestureType.SINGLE_TAP)
     {
         Vector2 rawLocalTapPos      = (Vector2)touchGesture.MetaData;
         Vector2 adjustedLocalTapPos = GlobalUtilities.ConvertMobileRelPosToUnityRelPos(rawLocalTapPos);
         if (menuManipLocalBound.Contains(adjustedLocalTapPos))
         {
             setMenuItemActive(false);
             _currentState = VirtualPadState.OBJECT_MANIP;
         }
         else if (menuDrawLocalBound.Contains(adjustedLocalTapPos))
         {
             setMenuItemActive(false);
             _currentState = VirtualPadState.DRAW;
         }
     }
 }
コード例 #2
0
        bool recognizePadPanningGesture(TouchPointerData[] avaiPointers, out TouchGesture recognizedGesture)
        {
            recognizedGesture = new TouchGesture();
            TouchPointerData anchorFinger = null;

            TouchPointerData[] movingFingers = new TouchPointerData[2];
            int movingFingersIdx             = 0;

            //classifying anchor and moving fingers
            for (int i = 0; i < avaiPointers.Length; i++)
            {
                if (Math.Abs(avaiPointers[i].RelVeloX) < 0.0001 && Math.Abs(avaiPointers[i].RelVeloY) < 0.0001)
                {
                    anchorFinger = avaiPointers[i];
                }
                else
                {
                    if (movingFingersIdx < movingFingers.Length)
                    {
                        movingFingers[movingFingersIdx++] = avaiPointers[i];
                    }
                }
            }
            //check movement of moving fingers to see if they are moving in the same direction
            if (anchorFinger == null || movingFingersIdx != movingFingers.Length)
            {
                return(false);
            }
            if (movingFingers[0].RelVeloX * movingFingers[1].RelVeloX < 0 || movingFingers[0].RelVeloY * movingFingers[1].RelVeloY < 0)
            {
                return(false);
            }
            else
            {
                Vector2 anchorPos     = new Vector2(anchorFinger.RelX, anchorFinger.RelY);
                Vector2 avgMovingVelo = new Vector2();
                avgMovingVelo.x = (movingFingers[0].RelVeloX + movingFingers[1].RelVeloX) / 2;
                avgMovingVelo.y = (movingFingers[0].RelVeloY + movingFingers[1].RelVeloY) / 2;
                Vector2 curMovingCenter = new Vector2();
                curMovingCenter.x = (movingFingers[0].RelX + movingFingers[1].RelX) / 2;
                curMovingCenter.y = (movingFingers[0].RelY + movingFingers[1].RelY) / 2;
                Vector2 futureMovingCenter = new Vector2();
                futureMovingCenter.x = curMovingCenter.x + avgMovingVelo.x / TOUCH_REFRESH_RATE;
                futureMovingCenter.y = curMovingCenter.y + avgMovingVelo.y / TOUCH_REFRESH_RATE;
                float   curDistanceToAnchor    = Vector2.Distance(curMovingCenter, anchorPos);
                float   futureDistanceToAnchor = Vector2.Distance(futureMovingCenter, anchorPos);
                Vector2 scaleRatio             = new Vector2(futureDistanceToAnchor / curDistanceToAnchor, futureDistanceToAnchor / curDistanceToAnchor);
                recognizedGesture.GestureType = TouchGestureType.PAD_SCALING;
                recognizedGesture.MetaData    = scaleRatio;
                return(true);
            }
        }
コード例 #3
0
        public void RecognizeGesture(TouchEventData curTouchEvent)
        {
            TouchGesture recognizedGesture = new TouchGesture();

            //if there are more than one fingers, there is no chance for a single tap
            if (curTouchEvent.PointerCount > 1)
            {
                stayStillSingleTouchDown = null;
            }
            if (curTouchEvent.PointerCount == 1 &&
                (Math.Abs(curTouchEvent.AvaiPointers[0].RelVeloX) > 0.0001 || Math.Abs(curTouchEvent.AvaiPointers[0].RelVeloY) > 0.0001))
            {
                stayStillSingleTouchDown = null;
            }
            //process cases with multi fingers
            if (curTouchEvent.PointerCount == 5)// && curTouchEvent.EventType == 0)
            {
                recognizedGesture.GestureType = TouchGestureType.FIVE_POINTERS;
                informGestureRecognizedEvent(recognizedGesture);
                return;
            }
            //recognizing scaling virtual pad gesture
            if (curTouchEvent.PointerCount == 3 && curTouchEvent.EventType == 1)
            {
                if (recognizePadPanningGesture(curTouchEvent.AvaiPointers, out recognizedGesture))
                {
                }
                else
                {
                }
                informGestureRecognizedEvent(recognizedGesture);
            }
            //recognizing pad translating gesture
            if (curTouchEvent.PointerCount == 2)
            {
                //two fingers moving in the same direction => translating the virtual pad
                if (curTouchEvent.AvaiPointers[0].RelVeloX * curTouchEvent.AvaiPointers[1].RelVeloX > 0 &&
                    curTouchEvent.AvaiPointers[0].RelVeloY * curTouchEvent.AvaiPointers[1].RelVeloY > 0)
                {
                    float avgVeloX = (curTouchEvent.AvaiPointers[0].RelVeloX + curTouchEvent.AvaiPointers[1].RelVeloX) / 2;
                    float veloXDif = Math.Abs(curTouchEvent.AvaiPointers[0].RelVeloX - curTouchEvent.AvaiPointers[1].RelVeloX);
                    float avgVeloY = (curTouchEvent.AvaiPointers[0].RelVeloY + curTouchEvent.AvaiPointers[1].RelVeloY) / 2;
                    float veloYDif = Math.Abs(curTouchEvent.AvaiPointers[0].RelVeloY - curTouchEvent.AvaiPointers[1].RelVeloY);
                    //if(veloXDif/avgVeloX < 0.2 && veloYDif/avgVeloY<0.2)
                    //{
                    recognizedGesture.GestureType = TouchGestureType.PAD_TRANSLATING;
                    Vector2 translateVelo = new Vector2();
                    translateVelo.x            = avgVeloX / TOUCH_REFRESH_RATE;
                    translateVelo.y            = avgVeloY / TOUCH_REFRESH_RATE;
                    recognizedGesture.MetaData = translateVelo;
                    informGestureRecognizedEvent(recognizedGesture);
                    return;
                }
                //two fingers moving in opposite direction => object scaling
                if (curTouchEvent.AvaiPointers[0].RelVeloX * curTouchEvent.AvaiPointers[1].RelVeloX < 0 ||
                    curTouchEvent.AvaiPointers[0].RelVeloY * curTouchEvent.AvaiPointers[1].RelVeloY < 0)
                {
                    recognizedGesture.GestureType = TouchGestureType.OBJECT_SCALING;
                    informGestureRecognizedEvent(recognizedGesture);
                    return;
                }
            }
            //process when there is only one finger
            if (curTouchEvent.EventType == 0 && curTouchEvent.PointerCount == 1)
            {
                stayStillSingleTouchDown = new RecordedTouch();
                stayStillSingleTouchDown.TouchPointers.Add(TouchPointerData.Create(curTouchEvent.AvaiPointers[0]));
                recognizedGesture.GestureType = TouchGestureType.SINGLE_TOUCH_DOWN;
                recognizedGesture.MetaData    = TouchPointerData.Create(curTouchEvent.AvaiPointers[0]);
                informGestureRecognizedEvent(recognizedGesture);
                return;
            }
            if (curTouchEvent.EventType == 2 && curTouchEvent.PointerCount == 0)
            {
                //first inform a non gesture for client to process if needed
                TouchGesture non_gesture = new TouchGesture();
                informGestureRecognizedEvent(non_gesture);
                RecordedTouch recordedTouchUp = new RecordedTouch();
                if (stayStillSingleTouchDown != null)
                {
                    TimeSpan touchDuration = recordedTouchUp.TimeStamp.Subtract(stayStillSingleTouchDown.TimeStamp);
                    if (touchDuration.TotalMilliseconds < 200)
                    {
                        recognizedGesture.GestureType = TouchGestureType.SINGLE_TAP;
                        recognizedGesture.MetaData    = new Vector2(stayStillSingleTouchDown.TouchPointers[0].RelX, stayStillSingleTouchDown.TouchPointers[0].RelY);
                    }
                    stayStillSingleTouchDown = null;
                    informGestureRecognizedEvent(recognizedGesture);
                    return;
                }
            }
        }