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