scale_gesture_detector.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Copyright 2014 The Chromium Authors. All rights reserved. 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// found in the LICENSE file. 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_ 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_ 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/memory/scoped_ptr.h" 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/time/time.h" 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "ui/events/gesture_detection/gesture_detection_export.h" 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "ui/events/gesture_detection/gesture_detector.h" 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectnamespace ui { 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass MotionEvent; 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Port of ScaleGestureDetector.java from Android 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// * platform/frameworks/base/core/java/android/view/ScaleGestureDetector.java 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// * Change-Id: I3e7926a4f6f9ab4951f380bd004499c78b3bda69 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// * Please update the Change-Id as upstream Android changes are pulled. 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass ScaleGestureDetector : public GestureDetector::SimpleGestureListener { 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public: 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct GESTURE_DETECTION_EXPORT Config { 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Config(); 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~Config(); 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GestureDetector::Config gesture_detector_config; 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool quick_scale_enabled; 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int min_scaling_touch_major; 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int min_scaling_span; 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }; 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project class ScaleGestureListener { 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public: 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual ~ScaleGestureListener() {} 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual bool OnScale(const ScaleGestureDetector& detector) = 0; 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual bool OnScaleBegin(const ScaleGestureDetector& detector) = 0; 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual void OnScaleEnd(const ScaleGestureDetector& detector) = 0; 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }; 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // A convenience class to extend when you only want to listen for a subset of 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // scaling-related events. This implements all methods in 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // |ScaleGestureListener| but does nothing. 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // |OnScale()| returns false so that a subclass can retrieve the accumulated 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // scale factor in an overridden |OnScaleEnd()|. 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // |OnScaleBegin() returns true. 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project class SimpleScaleGestureListener : public ScaleGestureListener { 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public: 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // ScaleGestureListener implementation. 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual bool OnScale(const ScaleGestureDetector&) OVERRIDE; 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual bool OnScaleBegin(const ScaleGestureDetector&) OVERRIDE; 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual void OnScaleEnd(const ScaleGestureDetector&) OVERRIDE; 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }; 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ScaleGestureDetector(const Config& config, ScaleGestureListener* listener); 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual ~ScaleGestureDetector(); 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Accepts MotionEvents and dispatches events to a |ScaleGestureListener| 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // when appropriate. 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Note: Applications should pass a complete and consistent event stream to 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // this method. A complete and consistent event stream involves all 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // MotionEvents from the initial ACTION_DOWN to the final ACTION_UP or 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // ACTION_CANCEL. 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Returns true if the event was processed and the detector wants to receive 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // the rest of the MotionEvents in this event stream. 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool OnTouchEvent(const MotionEvent& event); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Set whether the associated |ScaleGestureListener| should receive 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // OnScale callbacks when the user performs a doubletap followed by a swipe. 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void SetQuickScaleEnabled(bool scales); 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool IsQuickScaleEnabled() const; 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool IsInProgress() const; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float GetFocusX() const; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float GetFocusY() const; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float GetCurrentSpan() const; 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float GetCurrentSpanX() const; 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float GetCurrentSpanY() const; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float GetPreviousSpan() const; 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float GetPreviousSpanX() const; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float GetPreviousSpanY() const; 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float GetScaleFactor() const; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::TimeDelta GetTimeDelta() const; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::TimeTicks GetEventTime() const; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project private: 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project enum DoubleTapMode { DOUBLE_TAP_MODE_NONE, DOUBLE_TAP_MODE_IN_PROGRESS }; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // DoubleTapListener implementation. 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual bool OnDoubleTap(const MotionEvent& ev) OVERRIDE; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // The TouchMajor/TouchMinor elements of a MotionEvent can flutter/jitter on 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // some hardware/driver combos. Smooth out to get kinder, gentler behavior. 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void AddTouchHistory(const MotionEvent& ev); 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void ClearTouchHistory(); 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool InDoubleTapMode() const; 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ScaleGestureListener* const listener_; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Config config_; 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float focus_x_; 103e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati float focus_y_; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool quick_scale_enabled_; 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float curr_span_; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float prev_span_; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float initial_span_; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float curr_span_x_; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float curr_span_y_; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float prev_span_x_; 113e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati float prev_span_y_; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::TimeTicks curr_time_; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::TimeTicks prev_time_; 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool in_progress_; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int span_slop_; 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int min_span_; 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Bounds for recently seen values. 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float touch_upper_; 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float touch_lower_; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float touch_history_last_accepted_; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int touch_history_direction_; 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::TimeTicks touch_history_last_accepted_time_; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int touch_min_major_; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project float double_tap_focus_x_; 128e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati float double_tap_focus_y_; 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DoubleTapMode double_tap_mode_; 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool event_before_or_above_starting_gesture_event_; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project scoped_ptr<GestureDetector> gesture_detector_; 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DISALLOW_COPY_AND_ASSIGN(ScaleGestureDetector); 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} // namespace ui 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif // UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_ 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project