123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- // 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_MOBILE_SCROLLER_H_
- #define UI_EVENTS_MOBILE_SCROLLER_H_
- #include "base/time/time.h"
- #include "ui/events/events_base_export.h"
- #include "ui/events/gesture_curve.h"
- #include "ui/gfx/geometry/vector2d_f.h"
- namespace ui {
- // Native port of android.widget.Scroller.
- // * Change-Id: I4365946f890a76fcfa78ca9d69f2a8e0848095a9
- // * Please update the Change-Id as upstream Android changes are pulled.
- class EVENTS_BASE_EXPORT MobileScroller : public GestureCurve {
- public:
- struct EVENTS_BASE_EXPORT Config {
- Config();
- // Controls fling deceleration. Defaults to 0.015f.
- float fling_friction;
- // Controls fling accumulation. Defaults to disabled.
- bool flywheel_enabled;
- // Controls whether to use chromecast optimized
- // scrolling. Defaults to false, mimic normal Android scrolling.
- bool chromecast_optimized;
- };
- explicit MobileScroller(const Config& config);
- ~MobileScroller() override;
- // GestureCurve implementation.
- bool ComputeScrollOffset(base::TimeTicks time,
- gfx::Vector2dF* offset,
- gfx::Vector2dF* velocity) override;
- // Start scrolling by providing a starting point and the distance to travel.
- // The default value of 250 milliseconds will be used for the duration.
- void StartScroll(float start_x,
- float start_y,
- float dx,
- float dy,
- base::TimeTicks start_time);
- // Start scrolling by providing a starting point, the distance to travel,
- // and the duration of the scroll.
- void StartScroll(float start_x,
- float start_y,
- float dx,
- float dy,
- base::TimeTicks start_time,
- base::TimeDelta duration);
- // Start scrolling based on a fling gesture. The distance travelled will
- // depend on the initial velocity of the fling.
- void Fling(float start_x,
- float start_y,
- float velocity_x,
- float velocity_y,
- float min_x,
- float max_x,
- float min_y,
- float max_y,
- base::TimeTicks start_time);
- // Extend the scroll animation by |extend|. This allows a running animation
- // to scroll further and longer when used with |SetFinalX()| or |SetFinalY()|.
- void ExtendDuration(base::TimeDelta extend);
- void SetFinalX(float new_x);
- void SetFinalY(float new_y);
- // Stops the animation. Contrary to |ForceFinished()|, aborting the animation
- // causes the scroller to move to the final x and y position.
- void AbortAnimation();
- // Terminate the scroll without affecting the current x and y positions.
- void ForceFinished(bool finished);
- // Returns whether the scroller has finished scrolling.
- bool IsFinished() const;
- // Returns the time elapsed since the beginning of the scrolling.
- base::TimeDelta GetTimePassed() const;
- // Returns how long the scroll event will take.
- base::TimeDelta GetDuration() const;
- float GetStartX() const;
- float GetStartY() const;
- float GetCurrX() const;
- float GetCurrY() const;
- float GetCurrVelocity() const;
- float GetCurrVelocityX() const;
- float GetCurrVelocityY() const;
- float GetFinalX() const;
- float GetFinalY() const;
- bool IsScrollingInDirection(float xvel, float yvel) const;
- private:
- enum Mode {
- UNDEFINED,
- SCROLL_MODE,
- FLING_MODE,
- };
- bool ComputeScrollOffsetInternal(base::TimeTicks time);
- void RecomputeDeltas();
- double GetSplineDeceleration(float velocity) const;
- base::TimeDelta GetSplineFlingDuration(float velocity) const;
- double GetSplineFlingDistance(float velocity) const;
- Mode mode_;
- float start_x_;
- float start_y_;
- float final_x_;
- float final_y_;
- float min_x_;
- float max_x_;
- float min_y_;
- float max_y_;
- float curr_x_;
- float curr_y_;
- base::TimeTicks start_time_;
- base::TimeTicks curr_time_;
- base::TimeDelta duration_;
- double duration_seconds_reciprocal_;
- float delta_x_;
- float delta_x_norm_;
- float delta_y_;
- float delta_y_norm_;
- bool finished_;
- bool flywheel_enabled_;
- float velocity_;
- float curr_velocity_;
- float distance_;
- float fling_friction_;
- float deceleration_;
- float tuning_coeff_;
- };
- } // namespace ui
- #endif // UI_EVENTS_MOBILE_SCROLLER_H_
|