blob: 1dae38245068c327048d6d346cc974ae53cfe4fd [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_EVENTS_GESTURES_PHYSICS_BASED_FLING_CURVE_H_
#define UI_EVENTS_GESTURES_PHYSICS_BASED_FLING_CURVE_H_
#include "base/time/time.h"
#include "ui/events/events_base_export.h"
#include "ui/events/gesture_curve.h"
#include "ui/gfx/geometry/cubic_bezier.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/geometry/vector2d_f.h"
namespace ui {
// PhysicsBasedFlingCurve generates animation curve, similar to
// DirectManipulation's fling curve that can be used to scroll a UI element
// suitable for touch screen-based flings.
class EVENTS_BASE_EXPORT PhysicsBasedFlingCurve : public GestureCurve {
public:
PhysicsBasedFlingCurve(
const gfx::Vector2dF& velocity,
base::TimeTicks start_timestamp,
const gfx::Vector2dF& pixels_per_inch,
// Multiplier for fling distance based on fling boosting
const float boost_multiplier,
// Maximum fling distance subject to boost_multiplier and default
// bounds multiplier
const gfx::Size& bounding_size);
PhysicsBasedFlingCurve(const PhysicsBasedFlingCurve&) = delete;
PhysicsBasedFlingCurve& operator=(const PhysicsBasedFlingCurve&) = delete;
~PhysicsBasedFlingCurve() override;
// GestureCurve implementation.
bool ComputeScrollOffset(base::TimeTicks time,
gfx::Vector2dF* offset,
gfx::Vector2dF* velocity) override;
// TODO(crbug.com/1028501): Use base::TimeDelta for curve_duration()
// once crrev.com/c/1865928 is merged.
float curve_duration() const { return curve_duration_.InSecondsF(); }
const gfx::PointF& p1_for_testing() const { return p1_; }
const gfx::PointF& p2_for_testing() const { return p2_; }
static int default_bounds_multiplier_for_testing() {
return kDefaultBoundsMultiplier;
}
private:
// Default value used to scale the viewport when it is passed in as a
// parameter in the generation of a physics based fling curve. This value
// increases the upper bound of the scroll distance for a fling.
constexpr static int kDefaultBoundsMultiplier = 3;
// Calculates the curve duration and generates the control points for a bezier
// curve. The slope is based on the input initial |velocity|, calculated curve
// duration, and |distance_|. Returns the duration.
base::TimeDelta CalculateDurationAndConfigureControlPoints(
const gfx::Vector2dF& velocity);
// Time when fling curve is generated.
const base::TimeTicks start_timestamp_;
// Cubic bezier curve control points.
gfx::PointF p1_;
gfx::PointF p2_;
// Distance it can scroll with input velocity.
const gfx::Vector2dF distance_;
// Time until which fling can remain active relative to |start_timestamp_|.
const base::TimeDelta curve_duration_;
const gfx::CubicBezier bezier_;
base::TimeDelta previous_time_delta_;
gfx::Vector2dF cumulative_scroll_;
gfx::Vector2dF prev_offset_;
};
} // namespace ui
#endif // UI_EVENTS_GESTURES_PHYSICS_BASED_FLING_CURVE_H_