diff options
Diffstat (limited to 'chromium/ui/gfx/android/scroller.h')
-rw-r--r-- | chromium/ui/gfx/android/scroller.h | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/chromium/ui/gfx/android/scroller.h b/chromium/ui/gfx/android/scroller.h new file mode 100644 index 00000000000..39d7255dc87 --- /dev/null +++ b/chromium/ui/gfx/android/scroller.h @@ -0,0 +1,148 @@ +// 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_GFX_ANDROID_SCROLLER_H_ +#define UI_GFX_ANDROID_SCROLLER_H_ + +#include "base/time/time.h" +#include "ui/gfx/gfx_export.h" + +namespace gfx { + +// Native port of android.widget.Scroller. +// * Change-Id: I4365946f890a76fcfa78ca9d69f2a8e0848095a9 +// * Please update the Change-Id as upstream Android changes are pulled. +class GFX_EXPORT Scroller { + public: + struct Config { + Config(); + + // Controls fling deceleration. Defaults to 0.015f. + float fling_friction; + + // Controls fling accumulation. Defaults to disabled. + bool flywheel_enabled; + }; + + explicit Scroller(const Config& config); + ~Scroller(); + + // 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); + + // Call this when you want to know the new location. If it returns true, + // the animation is not yet finished. + bool ComputeScrollOffset(base::TimeTicks 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, + }; + + void OnDurationChanged(); + 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 gfx + +#endif // UI_GFX_ANDROID_SCROLLER_H_ |