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

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

Issue 171773012: Port of Android platform gesture detection code to C++ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase 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
« no previous file with comments | « ui/events/gesture_detection/motion_event.h ('k') | ui/events/gesture_detection/scale_gesture_detector.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/events/gesture_detection/scale_gesture_detector.h
diff --git a/ui/events/gesture_detection/scale_gesture_detector.h b/ui/events/gesture_detection/scale_gesture_detector.h
new file mode 100644
index 0000000000000000000000000000000000000000..9e84ca5e34fa0e1ff93f25d1dbb739aa22d67d4e
--- /dev/null
+++ b/ui/events/gesture_detection/scale_gesture_detector.h
@@ -0,0 +1,140 @@
+// Copyright 2014 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_SCALE_GESTURE_DETECTOR_H_
+#define UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "base/time/time.h"
+#include "ui/events/gesture_detection/gesture_detection_export.h"
+#include "ui/events/gesture_detection/gesture_detector.h"
+
+namespace ui {
+
+class MotionEvent;
+
+// Port of ScaleGestureDetector.java from Android
+// * platform/frameworks/base/core/java/android/view/ScaleGestureDetector.java
+// * Change-Id: I3e7926a4f6f9ab4951f380bd004499c78b3bda69
+// * Please update the Change-Id as upstream Android changes are pulled.
+class ScaleGestureDetector : public GestureDetector::SimpleGestureListener {
+ public:
+ struct GESTURE_DETECTION_EXPORT Config {
+ Config();
+ ~Config();
+ GestureDetector::Config gesture_detector_config;
+ bool quick_scale_enabled;
+ int min_scaling_touch_major;
+ int min_scaling_span;
+ };
+
+ class ScaleGestureListener {
+ public:
+ virtual ~ScaleGestureListener() {}
+ virtual bool OnScale(const ScaleGestureDetector& detector) = 0;
+ virtual bool OnScaleBegin(const ScaleGestureDetector& detector) = 0;
+ virtual void OnScaleEnd(const ScaleGestureDetector& detector) = 0;
+ };
+
+ // A convenience class to extend when you only want to listen for a subset of
+ // scaling-related events. This implements all methods in
+ // |ScaleGestureListener| but does nothing.
+ // |OnScale()| returns false so that a subclass can retrieve the accumulated
+ // scale factor in an overridden |OnScaleEnd()|.
+ // |OnScaleBegin() returns true.
+ class SimpleScaleGestureListener : public ScaleGestureListener {
+ public:
+ // ScaleGestureListener implementation.
+ virtual bool OnScale(const ScaleGestureDetector&) OVERRIDE;
+ virtual bool OnScaleBegin(const ScaleGestureDetector&) OVERRIDE;
+ virtual void OnScaleEnd(const ScaleGestureDetector&) OVERRIDE;
+ };
+
+ ScaleGestureDetector(const Config& config, ScaleGestureListener* listener);
+ virtual ~ScaleGestureDetector();
+
+ // Accepts MotionEvents and dispatches events to a |ScaleGestureListener|
+ // when appropriate.
+ //
+ // Note: Applications should pass a complete and consistent event stream to
+ // this method. A complete and consistent event stream involves all
+ // MotionEvents from the initial ACTION_DOWN to the final ACTION_UP or
+ // ACTION_CANCEL.
+ //
+ // Returns true if the event was processed and the detector wants to receive
+ // the rest of the MotionEvents in this event stream.
+ bool OnTouchEvent(const MotionEvent& event);
+
+ // Set whether the associated |ScaleGestureListener| should receive
+ // OnScale callbacks when the user performs a doubletap followed by a swipe.
+ void SetQuickScaleEnabled(bool scales);
+ bool IsQuickScaleEnabled() const;
+ bool IsInProgress() const;
+ float GetFocusX() const;
+ float GetFocusY() const;
+ float GetCurrentSpan() const;
+ float GetCurrentSpanX() const;
+ float GetCurrentSpanY() const;
+ float GetPreviousSpan() const;
+ float GetPreviousSpanX() const;
+ float GetPreviousSpanY() const;
+ float GetScaleFactor() const;
+ base::TimeDelta GetTimeDelta() const;
+ base::TimeTicks GetEventTime() const;
+
+ private:
+ enum DoubleTapMode { DOUBLE_TAP_MODE_NONE, DOUBLE_TAP_MODE_IN_PROGRESS };
+
+ // DoubleTapListener implementation.
+ virtual bool OnDoubleTap(const MotionEvent& ev) OVERRIDE;
+
+ // The TouchMajor/TouchMinor elements of a MotionEvent can flutter/jitter on
+ // some hardware/driver combos. Smooth out to get kinder, gentler behavior.
+ void AddTouchHistory(const MotionEvent& ev);
+ void ClearTouchHistory();
+ bool InDoubleTapMode() const;
+
+ ScaleGestureListener* const listener_;
+
+ Config config_;
+
+ float focus_x_;
+ float focus_y_;
+
+ bool quick_scale_enabled_;
+
+ float curr_span_;
+ float prev_span_;
+ float initial_span_;
+ float curr_span_x_;
+ float curr_span_y_;
+ float prev_span_x_;
+ float prev_span_y_;
+ base::TimeTicks curr_time_;
+ base::TimeTicks prev_time_;
+ bool in_progress_;
+ int span_slop_;
+ int min_span_;
+
+ // Bounds for recently seen values.
+ float touch_upper_;
+ float touch_lower_;
+ float touch_history_last_accepted_;
+ int touch_history_direction_;
+ base::TimeTicks touch_history_last_accepted_time_;
+ int touch_min_major_;
+ float double_tap_focus_x_;
+ float double_tap_focus_y_;
+ DoubleTapMode double_tap_mode_;
+
+ bool event_before_or_above_starting_gesture_event_;
+
+ scoped_ptr<GestureDetector> gesture_detector_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScaleGestureDetector);
+};
+
+} // namespace ui
+
+#endif // UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_
« no previous file with comments | « ui/events/gesture_detection/motion_event.h ('k') | ui/events/gesture_detection/scale_gesture_detector.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698