• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_
149