| 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 |