Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: ui/events/gesture_detection/gesture_detector.h

Issue 128613003: [Tracking Patch] Unified gesture detection (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/events/gesture_detection/gesture_detector.h
diff --git a/ui/events/gesture_detection/gesture_detector.h b/ui/events/gesture_detection/gesture_detector.h
new file mode 100644
index 0000000000000000000000000000000000000000..3a508f0bbd30cbb62db5a91056f77413826f3318
--- /dev/null
+++ b/ui/events/gesture_detection/gesture_detector.h
@@ -0,0 +1,145 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_EVENTS_GESTURE_DETECTION_GESTURE_DETECTOR_H_
+#define UI_EVENTS_GESTURE_DETECTION_GESTURE_DETECTOR_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "ui/events/gesture_detection/gesture_detection_export.h"
+#include "ui/events/gesture_detection/velocity_tracker_state.h"
+
+namespace ui {
+
+class MotionEvent;
+
+// Port of GestureDetector.java from Android
+// * platform/frameworks/base/core/java/android/view/GestureDetector.java
+// * Change-Id: Ib470735ec929b0b358fca4597e92dc81084e675f
+// * Please update the Change-Id as upstream Android changes are pulled.
+class GestureDetector {
+ public:
+ struct GESTURE_DETECTION_EXPORT Config {
+ Config();
+ ~Config();
+ base::TimeDelta longpress_timeout;
+ base::TimeDelta tap_timeout;
+ base::TimeDelta double_tap_timeout;
+ int scaled_touch_slop;
tdresser 2014/02/19 17:44:12 I'm not too keen on the use of "scaled" in these n
jdduke (slow) 2014/02/19 18:51:58 Yeah, all of the scaled prefixes are remnants of t
+ int scaled_double_tap_slop;
+ int scaled_minimum_fling_velocity;
+ int scaled_maximum_fling_velocity;
+ };
+
+ class OnGestureListener {
+ public:
+ virtual ~OnGestureListener() {}
+ virtual bool OnDown(const MotionEvent& e) = 0;
+ virtual void OnShowPress(const MotionEvent& e) = 0;
+ virtual bool OnSingleTapUp(const MotionEvent& e) = 0;
+ virtual bool OnLongPress(const MotionEvent& e) = 0;
+ virtual bool OnScroll(const MotionEvent& e1, const MotionEvent& e2,
+ float distance_x, float distance_y) = 0;
+ virtual bool OnFling(const MotionEvent& e1, const MotionEvent& e2,
+ float velocity_x, float velocity_y) = 0;
+ };
+
+ class OnDoubleTapListener {
+ public:
+ virtual ~OnDoubleTapListener() {}
+ virtual bool OnSingleTapConfirmed(const MotionEvent& e) = 0;
+ virtual bool OnDoubleTap(const MotionEvent& e) = 0;
+ virtual bool OnDoubleTapEvent(const MotionEvent& e) = 0;
+ };
+
+ // A convenience class to extend when you only want to listen for a subset
+ // of all the gestures. This implements all methods in the
+ // |OnGestureListener| and |OnDoubleTapListener| but does
+ // nothing and returns false for all applicable methods.
+ class SimpleOnGestureListener : public OnGestureListener,
+ public OnDoubleTapListener {
+ // OnGestureListener
+ virtual bool OnDown(const MotionEvent& e) OVERRIDE;
+ virtual void OnShowPress(const MotionEvent& e) OVERRIDE;
+ virtual bool OnSingleTapUp(const MotionEvent& e) OVERRIDE;
+ virtual bool OnLongPress(const MotionEvent& e) OVERRIDE;
+ virtual bool OnScroll(const MotionEvent& e1, const MotionEvent& e2,
+ float distance_x, float distance_y) OVERRIDE;
+ virtual bool OnFling(const MotionEvent& e1, const MotionEvent& e2,
+ float velocity_x, float velocity_y) OVERRIDE;
+
+ // OnDoubleTapListener
+ virtual bool OnSingleTapConfirmed(const MotionEvent& e) OVERRIDE;
+ virtual bool OnDoubleTap(const MotionEvent& e) OVERRIDE;
+ virtual bool OnDoubleTapEvent(const MotionEvent& e) OVERRIDE;
+ };
+
+ GestureDetector(const Config& config,
+ OnGestureListener* listener,
+ OnDoubleTapListener* optional_double_tap_listener);
+ ~GestureDetector();
+
+ bool OnTouchEvent(const MotionEvent& ev);
+
+ void set_on_doubletap_listener(OnDoubleTapListener* double_tap_listener) {
+ double_tap_listener_ = double_tap_listener;
+ }
+
+ void set_is_longpress_enabled(bool is_longpress_enabled) {
+ is_longpress_enabled_ = is_longpress_enabled;
+ }
+
+ bool is_longpress_enabled() const { return is_longpress_enabled_; }
+
+ private:
+ void Init(Config config);
+ void OnShowPressTimeout();
+ void OnLongPressTimeout();
+ void OnTapTimeout();
+ void Cancel();
+ void CancelTaps();
+ bool IsConsideredDoubleTap(const MotionEvent& first_down,
+ const MotionEvent& first_up,
+ const MotionEvent& second_down);
+
+ class TimeoutGestureHandler;
+ scoped_ptr<TimeoutGestureHandler> timeout_handler_;
+ OnGestureListener* const listener_;
+ OnDoubleTapListener* double_tap_listener_;
+
+ int touch_slop_square_;
+ int double_tap_touch_slop_square_;
+ int double_tap_slop_square_;
+ int min_fling_velocity_;
+ int max_fling_velocity_;
+ base::TimeDelta double_tap_timeout_;
+
+ bool still_down_;
+ bool defer_confirm_single_tap_;
+ bool in_long_press_;
+ bool always_in_tap_region_;
+ bool always_in_bigger_tap_region_;
+
+ scoped_ptr<MotionEvent> current_down_event_;
+ scoped_ptr<MotionEvent> previous_up_event_;
+
+ // True when the user is still touching for the second tap (down, move, and
+ // up events). Can only be true if there is a double tap listener attached.
+ bool is_double_tapping_;
+
+ float last_focus_x_;
+ float last_focus_y_;
+ float down_focus_x_;
+ float down_focus_y_;
+
+ bool is_longpress_enabled_;
+
+ // Determines speed during touch scrolling.
+ VelocityTrackerState velocity_tracker_;
+
+ DISALLOW_COPY_AND_ASSIGN(GestureDetector);
+};
+
+} // namespace ui
+
+#endif // UI_EVENTS_GESTURE_DETECTION_GESTURE_DETECTOR_H_

Powered by Google App Engine
This is Rietveld 408576698