1 /* 2 * Copyright 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 //-------------------------------------------------------------------------------- 18 // gestureDetector.h 19 //-------------------------------------------------------------------------------- 20 #ifndef GESTUREDETECTOR_H_ 21 #define GESTUREDETECTOR_H_ 22 23 #include <vector> 24 25 #include <android/sensor.h> 26 #include <android/log.h> 27 #include <android_native_app_glue.h> 28 #include <android/native_window_jni.h> 29 #include "JNIHelper.h" 30 #include "vecmath.h" 31 32 namespace ndk_helper 33 { 34 //-------------------------------------------------------------------------------- 35 // Constants 36 //-------------------------------------------------------------------------------- 37 const int32_t DOUBLE_TAP_TIMEOUT = 300 * 1000000; 38 const int32_t TAP_TIMEOUT = 180 * 1000000; 39 const int32_t DOUBLE_TAP_SLOP = 100; 40 const int32_t TOUCH_SLOP = 8; 41 42 enum 43 { 44 GESTURE_STATE_NONE = 0, 45 GESTURE_STATE_START = 1, 46 GESTURE_STATE_MOVE = 2, 47 GESTURE_STATE_END = 4, 48 GESTURE_STATE_ACTION = (GESTURE_STATE_START | GESTURE_STATE_END), 49 }; 50 typedef int32_t GESTURE_STATE; 51 52 /****************************************************************** 53 * Base class of Gesture Detectors 54 * GestureDetectors handles input events and detect gestures 55 * Note that different detectors may detect gestures with an event at 56 * same time. The caller needs to manage gesture priority accordingly 57 * 58 */ 59 class GestureDetector 60 { 61 protected: 62 float dp_factor_; 63 public: 64 GestureDetector(); ~GestureDetector()65 virtual ~GestureDetector() 66 { 67 } 68 virtual void SetConfiguration( AConfiguration* config ); 69 70 virtual GESTURE_STATE Detect( const AInputEvent* motion_event ) = 0; 71 }; 72 73 /****************************************************************** 74 * Tap gesture detector 75 * Returns GESTURE_STATE_ACTION when a tap gesture is detected 76 * 77 */ 78 class TapDetector: public GestureDetector 79 { 80 private: 81 int32_t down_pointer_id_; 82 float down_x_; 83 float down_y_; 84 public: TapDetector()85 TapDetector() 86 { 87 } ~TapDetector()88 virtual ~TapDetector() 89 { 90 } 91 virtual GESTURE_STATE Detect( const AInputEvent* motion_event ); 92 }; 93 94 /****************************************************************** 95 * Pinch gesture detector 96 * Returns GESTURE_STATE_ACTION when a double-tap gesture is detected 97 * 98 */ 99 class DoubletapDetector: public GestureDetector 100 { 101 private: 102 TapDetector tap_detector_; 103 int64_t last_tap_time_; 104 float last_tap_x_; 105 float last_tap_y_; 106 107 public: DoubletapDetector()108 DoubletapDetector() 109 { 110 } ~DoubletapDetector()111 virtual ~DoubletapDetector() 112 { 113 } 114 virtual GESTURE_STATE Detect( const AInputEvent* motion_event ); 115 virtual void SetConfiguration( AConfiguration* config ); 116 }; 117 118 /****************************************************************** 119 * Double gesture detector 120 * Returns pinch gesture state when a pinch gesture is detected 121 * The class handles multiple touches more than 2 122 * When the finger 1,2,3 are tapped and then finger 1 is released, 123 * the detector start new pinch gesture with finger 2 & 3. 124 */ 125 class PinchDetector: public GestureDetector 126 { 127 private: 128 int32_t FindIndex( const AInputEvent* event, int32_t id ); 129 const AInputEvent* event_; 130 std::vector<int32_t> vec_pointers_; 131 132 public: PinchDetector()133 PinchDetector() 134 { 135 } ~PinchDetector()136 virtual ~PinchDetector() 137 { 138 } 139 virtual GESTURE_STATE Detect( const AInputEvent* event ); 140 bool GetPointers( Vec2& v1, Vec2& v2 ); 141 }; 142 143 /****************************************************************** 144 * Drag gesture detector 145 * Returns drag gesture state when a drag-tap gesture is detected 146 * 147 */ 148 class DragDetector: public GestureDetector 149 { 150 private: 151 int32_t FindIndex( const AInputEvent* event, int32_t id ); 152 const AInputEvent* event_; 153 std::vector<int32_t> vec_pointers_; 154 public: DragDetector()155 DragDetector() 156 { 157 } ~DragDetector()158 virtual ~DragDetector() 159 { 160 } 161 virtual GESTURE_STATE Detect( const AInputEvent* event ); 162 bool GetPointer( Vec2& v ); 163 }; 164 165 } //namespace ndkHelper 166 #endif /* GESTUREDETECTOR_H_ */ 167