/* * Copyright 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //-------------------------------------------------------------------------------- // gestureDetector.h //-------------------------------------------------------------------------------- #ifndef GESTUREDETECTOR_H_ #define GESTUREDETECTOR_H_ #include #include #include #include #include #include "JNIHelper.h" #include "vecmath.h" namespace ndk_helper { //-------------------------------------------------------------------------------- // Constants //-------------------------------------------------------------------------------- const int32_t DOUBLE_TAP_TIMEOUT = 300 * 1000000; const int32_t TAP_TIMEOUT = 180 * 1000000; const int32_t DOUBLE_TAP_SLOP = 100; const int32_t TOUCH_SLOP = 8; enum { GESTURE_STATE_NONE = 0, GESTURE_STATE_START = 1, GESTURE_STATE_MOVE = 2, GESTURE_STATE_END = 4, GESTURE_STATE_ACTION = (GESTURE_STATE_START | GESTURE_STATE_END), }; typedef int32_t GESTURE_STATE; /****************************************************************** * Base class of Gesture Detectors * GestureDetectors handles input events and detect gestures * Note that different detectors may detect gestures with an event at * same time. The caller needs to manage gesture priority accordingly * */ class GestureDetector { protected: float dp_factor_; public: GestureDetector(); virtual ~GestureDetector() { } virtual void SetConfiguration( AConfiguration* config ); virtual GESTURE_STATE Detect( const AInputEvent* motion_event ) = 0; }; /****************************************************************** * Tap gesture detector * Returns GESTURE_STATE_ACTION when a tap gesture is detected * */ class TapDetector: public GestureDetector { private: int32_t down_pointer_id_; float down_x_; float down_y_; public: TapDetector() { } virtual ~TapDetector() { } virtual GESTURE_STATE Detect( const AInputEvent* motion_event ); }; /****************************************************************** * Pinch gesture detector * Returns GESTURE_STATE_ACTION when a double-tap gesture is detected * */ class DoubletapDetector: public GestureDetector { private: TapDetector tap_detector_; int64_t last_tap_time_; float last_tap_x_; float last_tap_y_; public: DoubletapDetector() { } virtual ~DoubletapDetector() { } virtual GESTURE_STATE Detect( const AInputEvent* motion_event ); virtual void SetConfiguration( AConfiguration* config ); }; /****************************************************************** * Double gesture detector * Returns pinch gesture state when a pinch gesture is detected * The class handles multiple touches more than 2 * When the finger 1,2,3 are tapped and then finger 1 is released, * the detector start new pinch gesture with finger 2 & 3. */ class PinchDetector: public GestureDetector { private: int32_t FindIndex( const AInputEvent* event, int32_t id ); const AInputEvent* event_; std::vector vec_pointers_; public: PinchDetector() { } virtual ~PinchDetector() { } virtual GESTURE_STATE Detect( const AInputEvent* event ); bool GetPointers( Vec2& v1, Vec2& v2 ); }; /****************************************************************** * Drag gesture detector * Returns drag gesture state when a drag-tap gesture is detected * */ class DragDetector: public GestureDetector { private: int32_t FindIndex( const AInputEvent* event, int32_t id ); const AInputEvent* event_; std::vector vec_pointers_; public: DragDetector() { } virtual ~DragDetector() { } virtual GESTURE_STATE Detect( const AInputEvent* event ); bool GetPointer( Vec2& v ); }; } //namespace ndkHelper #endif /* GESTUREDETECTOR_H_ */