OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef UI_GFX_ANDROID_SCROLLER_H_ |
| 6 #define UI_GFX_ANDROID_SCROLLER_H_ |
| 7 |
| 8 #include "base/time/time.h" |
| 9 #include "ui/gfx/gfx_export.h" |
| 10 |
| 11 namespace gfx { |
| 12 |
| 13 // Native port of android.widget.Scroller. |
| 14 // * Change-Id: I4365946f890a76fcfa78ca9d69f2a8e0848095a9 |
| 15 // * Please update the Change-Id as upstream Android changes are pulled. |
| 16 class GFX_EXPORT Scroller { |
| 17 public: |
| 18 struct Config { |
| 19 Config(); |
| 20 |
| 21 // Controls fling deceleration. Defaults to 0.015f. |
| 22 float fling_friction; |
| 23 |
| 24 // Controls fling accumulation. Defaults to disabled. |
| 25 bool flywheel_enabled; |
| 26 }; |
| 27 |
| 28 explicit Scroller(const Config& config); |
| 29 ~Scroller(); |
| 30 |
| 31 // Start scrolling by providing a starting point and the distance to travel. |
| 32 // The default value of 250 milliseconds will be used for the duration. |
| 33 void StartScroll(float start_x, |
| 34 float start_y, |
| 35 float dx, |
| 36 float dy, |
| 37 base::TimeTicks start_time); |
| 38 |
| 39 // Start scrolling by providing a starting point, the distance to travel, |
| 40 // and the duration of the scroll. |
| 41 void StartScroll(float start_x, |
| 42 float start_y, |
| 43 float dx, |
| 44 float dy, |
| 45 base::TimeTicks start_time, |
| 46 base::TimeDelta duration); |
| 47 |
| 48 // Start scrolling based on a fling gesture. The distance travelled will |
| 49 // depend on the initial velocity of the fling. |
| 50 void Fling(float start_x, |
| 51 float start_y, |
| 52 float velocity_x, |
| 53 float velocity_y, |
| 54 float min_x, |
| 55 float max_x, |
| 56 float min_y, |
| 57 float max_y, |
| 58 base::TimeTicks start_time); |
| 59 |
| 60 // Call this when you want to know the new location. If it returns true, |
| 61 // the animation is not yet finished. |
| 62 bool ComputeScrollOffset(base::TimeTicks time); |
| 63 |
| 64 // Extend the scroll animation by |extend|. This allows a running animation |
| 65 // to scroll further and longer when used with |SetFinalX()| or |SetFinalY()|. |
| 66 void ExtendDuration(base::TimeDelta extend); |
| 67 void SetFinalX(float new_x); |
| 68 void SetFinalY(float new_y); |
| 69 |
| 70 // Stops the animation. Contrary to |ForceFinished()|, aborting the animation |
| 71 // causes the scroller to move to the final x and y position. |
| 72 void AbortAnimation(); |
| 73 |
| 74 // Terminate the scroll without affecting the current x and y positions. |
| 75 void ForceFinished(bool finished); |
| 76 |
| 77 // Returns whether the scroller has finished scrolling. |
| 78 bool IsFinished() const; |
| 79 |
| 80 // Returns the time elapsed since the beginning of the scrolling. |
| 81 base::TimeDelta GetTimePassed() const; |
| 82 |
| 83 // Returns how long the scroll event will take. |
| 84 base::TimeDelta GetDuration() const; |
| 85 |
| 86 float GetStartX() const; |
| 87 float GetStartY() const; |
| 88 float GetCurrX() const; |
| 89 float GetCurrY() const; |
| 90 float GetCurrVelocity() const; |
| 91 float GetCurrVelocityX() const; |
| 92 float GetCurrVelocityY() const; |
| 93 float GetFinalX() const; |
| 94 float GetFinalY() const; |
| 95 |
| 96 bool IsScrollingInDirection(float xvel, float yvel) const; |
| 97 |
| 98 private: |
| 99 enum Mode { |
| 100 UNDEFINED, |
| 101 SCROLL_MODE, |
| 102 FLING_MODE, |
| 103 }; |
| 104 |
| 105 void OnDurationChanged(); |
| 106 void RecomputeDeltas(); |
| 107 |
| 108 double GetSplineDeceleration(float velocity) const; |
| 109 base::TimeDelta GetSplineFlingDuration(float velocity) const; |
| 110 double GetSplineFlingDistance(float velocity) const; |
| 111 |
| 112 Mode mode_; |
| 113 |
| 114 float start_x_; |
| 115 float start_y_; |
| 116 float final_x_; |
| 117 float final_y_; |
| 118 |
| 119 float min_x_; |
| 120 float max_x_; |
| 121 float min_y_; |
| 122 float max_y_; |
| 123 |
| 124 float curr_x_; |
| 125 float curr_y_; |
| 126 base::TimeTicks start_time_; |
| 127 base::TimeTicks curr_time_; |
| 128 base::TimeDelta duration_; |
| 129 double duration_seconds_reciprocal_; |
| 130 float delta_x_; |
| 131 float delta_x_norm_; |
| 132 float delta_y_; |
| 133 float delta_y_norm_; |
| 134 bool finished_; |
| 135 bool flywheel_enabled_; |
| 136 |
| 137 float velocity_; |
| 138 float curr_velocity_; |
| 139 float distance_; |
| 140 |
| 141 float fling_friction_; |
| 142 float deceleration_; |
| 143 float tuning_coeff_; |
| 144 }; |
| 145 |
| 146 } // namespace gfx |
| 147 |
| 148 #endif // UI_GFX_ANDROID_SCROLLER_H_ |
OLD | NEW |