Browse Source

Fixed hold gesture detection

- Fixed gestures hold detection.
- Improved hold state detection for little touch position increments
(sensitivity).
victorfisac 9 years ago
parent
commit
233f7611da
1 changed files with 14 additions and 4 deletions
  1. 14 4
      src/gestures.c

+ 14 - 4
src/gestures.c

@@ -217,8 +217,13 @@ void ProcessGestureEvent(GestureEvent event)
                     angle = CalculateAngle(initialDragPosition, endDragPosition, magnitude);
                     angle = CalculateAngle(initialDragPosition, endDragPosition, magnitude);
                     intensity = magnitude / (float)draggingTimeCounter;
                     intensity = magnitude / (float)draggingTimeCounter;
                     
                     
-                    currentGesture = GESTURE_DRAG;
-                    draggingTimeCounter++;
+                    // Check if drag movement is less than minimum to keep it as hold state or switch to drag state
+                    if(magnitude > FORCE_TO_SWIPE)
+                    {
+                        currentGesture = GESTURE_DRAG;
+                        draggingTimeCounter++;
+                    }
+                    else currentGesture = GESTURE_HOLD;
                 }
                 }
             }
             }
         } break;
         } break;
@@ -339,8 +344,13 @@ void UpdateGestures(void)
 {
 {
     // NOTE: Gestures are processed through system callbacks on touch events
     // NOTE: Gestures are processed through system callbacks on touch events
     
     
-    if ((previousGesture == GESTURE_TAP) && (currentGesture == GESTURE_TAP)) currentGesture = GESTURE_HOLD;
-    else if (currentGesture != GESTURE_HOLD) currentGesture = GESTURE_NONE;
+    // When screen is touched, in first frame GESTURE_TAP is called but in next frame touch event callback is not called (if touch position doesn't change),
+    // so we need to store previous frame gesture type manually in this update function to switch to HOLD if current gesture is
+    // GESTURE_TAP two frames in a row. Due to current gesture is set to HOLD, current gesture doesn't need to be reset to NONE every frame.
+    // It will be reset when UP is called.
+    if(currentGesture == GESTURE_TAP) previousGesture = currentGesture;
+    
+    if(previousGesture == GESTURE_TAP && currentGesture == GESTURE_TAP) currentGesture = GESTURE_HOLD;
 }
 }
 
 
 //----------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------