Home | History | Annotate | Download | only in android
      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