summaryrefslogtreecommitdiffstats
path: root/ui/views/animation
diff options
context:
space:
mode:
authorvollick@google.com <vollick@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-24 15:48:13 +0000
committervollick@google.com <vollick@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-24 15:48:13 +0000
commitdb525e272982eb3a8dc35f6a65fca687cd518161 (patch)
tree5c92789f67778d7e4fddfdf941c61c975e8c6510 /ui/views/animation
parent0a45181e14dfb2f5bd85174228c7845fca9d1bf2 (diff)
downloadchromium_src-db525e272982eb3a8dc35f6a65fca687cd518161.zip
chromium_src-db525e272982eb3a8dc35f6a65fca687cd518161.tar.gz
chromium_src-db525e272982eb3a8dc35f6a65fca687cd518161.tar.bz2
Support touch scroll gestures in menus.
Depends on http://codereview.chromium.org/8364039/ BUG=None TEST=None Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=118834 Review URL: https://chromiumcodereview.appspot.com/8508024 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118841 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views/animation')
-rw-r--r--ui/views/animation/scroll_animator.cc82
-rw-r--r--ui/views/animation/scroll_animator.h63
2 files changed, 145 insertions, 0 deletions
diff --git a/ui/views/animation/scroll_animator.cc b/ui/views/animation/scroll_animator.cc
new file mode 100644
index 0000000..1e484a3
--- /dev/null
+++ b/ui/views/animation/scroll_animator.cc
@@ -0,0 +1,82 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/animation/scroll_animator.h"
+
+#include <algorithm>
+#include <cmath>
+
+#include "base/logging.h"
+#include "ui/base/animation/slide_animation.h"
+
+namespace {
+const float kDefaultAcceleration = -1500.0f; // in pixels per second^2
+
+// Assumes that d0 == 0.0f
+float GetPosition(float v0, float a, float t) {
+ float max_t = -v0 / a;
+ if (t > max_t)
+ t = max_t;
+ return t * (v0 + 0.5f * a * t);
+}
+
+float GetDelta(float v0, float a, float t1, float t2) {
+ return GetPosition(v0, a, t2) - GetPosition(v0, a, t1);
+}
+
+} // namespace
+
+namespace views {
+
+ScrollAnimator::ScrollAnimator(ScrollDelegate* delegate)
+ : delegate_(delegate),
+ velocity_x_(0.0f),
+ velocity_y_(0.0f),
+ last_t_(0.0f),
+ duration_(0.0f),
+ acceleration_(kDefaultAcceleration) {
+ DCHECK(delegate);
+}
+
+ScrollAnimator::~ScrollAnimator() {
+ Stop();
+}
+
+void ScrollAnimator::Start(float velocity_x, float velocity_y) {
+ if (acceleration_ >= 0.0f)
+ acceleration_ = kDefaultAcceleration;
+ float v = std::max(fabs(velocity_x), fabs(velocity_y));
+ last_t_ = 0.0f;
+ velocity_x_ = velocity_x;
+ velocity_y_ = velocity_y;
+ duration_ = -v / acceleration_; // in seconds
+ animation_.reset(new ui::SlideAnimation(this));
+ animation_->SetSlideDuration(static_cast<int>(duration_ * 1000));
+ animation_->Show();
+}
+
+void ScrollAnimator::Stop() {
+ velocity_x_ = velocity_y_ = last_t_ = duration_ = 0.0f;
+ animation_.reset();
+}
+
+void ScrollAnimator::AnimationEnded(const ui::Animation* animation) {
+ Stop();
+}
+
+void ScrollAnimator::AnimationProgressed(const ui::Animation* animation) {
+ float t = static_cast<float>(animation->GetCurrentValue()) * duration_;
+ float a_x = velocity_x_ > 0 ? acceleration_ : -acceleration_;
+ float a_y = velocity_y_ > 0 ? acceleration_ : -acceleration_;
+ float dx = GetDelta(velocity_x_, a_x, last_t_, t);
+ float dy = GetDelta(velocity_y_, a_y, last_t_, t);
+ last_t_ = t;
+ delegate_->OnScroll(dx, dy);
+}
+
+void ScrollAnimator::AnimationCanceled(const ui::Animation* animation) {
+ Stop();
+}
+
+} // namespace views
diff --git a/ui/views/animation/scroll_animator.h b/ui/views/animation/scroll_animator.h
new file mode 100644
index 0000000..dad27fa
--- /dev/null
+++ b/ui/views/animation/scroll_animator.h
@@ -0,0 +1,63 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_ANIMATION_SCROLL_ANIMATOR_H_
+#define UI_VIEWS_ANIMATION_SCROLL_ANIMATOR_H_
+#pragma once
+
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+#include "ui/base/animation/animation_delegate.h"
+#include "ui/views/views_export.h"
+
+namespace ui {
+class SlideAnimation;
+}
+
+namespace views {
+
+class VIEWS_EXPORT ScrollDelegate {
+ public:
+ virtual void OnScroll(float dx, float dy) = 0;
+
+ protected:
+ ~ScrollDelegate() {}
+};
+
+class VIEWS_EXPORT ScrollAnimator : public ui::AnimationDelegate {
+ public:
+ // The ScrollAnimator does not own the delegate. Uses default acceleration.
+ explicit ScrollAnimator(ScrollDelegate* delegate);
+ virtual ~ScrollAnimator();
+
+ // Use this if you would prefer different acceleration than the default.
+ void set_acceleration(float acceleration) { acceleration_ = acceleration; }
+
+ void Start(float velocity_x, float velocity_y);
+ void Stop();
+
+ bool is_scrolling() const { return !!animation_.get(); }
+
+ private:
+ // Implementation of ui::AnimationDelegate.
+ virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE;
+ virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE;
+ virtual void AnimationCanceled(const ui::Animation* animation) OVERRIDE;
+
+ ScrollDelegate* delegate_;
+
+ float velocity_x_;
+ float velocity_y_;
+ float last_t_;
+ float duration_;
+ float acceleration_;
+
+ scoped_ptr<ui::SlideAnimation> animation_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScrollAnimator);
+};
+
+} // namespace views
+
+#endif // UI_VIEWS_ANIMATION_SCROLL_ANIMATOR_H_