OLD | NEW |
| (Empty) |
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 #include "content/child/fling_animator_impl_android.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "third_party/WebKit/public/platform/WebFloatSize.h" | |
9 #include "third_party/WebKit/public/platform/WebGestureCurveTarget.h" | |
10 #include "ui/gfx/frame_time.h" | |
11 #include "ui/gfx/vector2d.h" | |
12 | |
13 namespace content { | |
14 | |
15 namespace { | |
16 | |
17 // Value taken directly from Android's ViewConfiguration. As the value has not | |
18 // changed in 4+ years, and does not depend on any device-specific configuration | |
19 // parameters, copy it directly to avoid potential JNI interop issues in the | |
20 // render process (see crbug.com/362614). | |
21 const float kDefaultAndroidPlatformScrollFriction = 0.015f; | |
22 | |
23 gfx::Scroller::Config GetScrollerConfig() { | |
24 gfx::Scroller::Config config; | |
25 config.flywheel_enabled = false; | |
26 config.fling_friction = kDefaultAndroidPlatformScrollFriction; | |
27 return config; | |
28 } | |
29 | |
30 } // namespace | |
31 | |
32 FlingAnimatorImpl::FlingAnimatorImpl() | |
33 : is_active_(false), | |
34 scroller_(GetScrollerConfig()) {} | |
35 | |
36 FlingAnimatorImpl::~FlingAnimatorImpl() {} | |
37 | |
38 void FlingAnimatorImpl::StartFling(const gfx::PointF& velocity) { | |
39 // No bounds on the fling. See http://webkit.org/b/96403 | |
40 // Instead, use the largest possible bounds for minX/maxX/minY/maxY. The | |
41 // compositor will ignore any attempt to scroll beyond the end of the page. | |
42 | |
43 DCHECK(velocity.x() || velocity.y()); | |
44 if (is_active_) | |
45 CancelFling(); | |
46 | |
47 is_active_ = true; | |
48 scroller_.Fling(0, | |
49 0, | |
50 velocity.x(), | |
51 velocity.y(), | |
52 INT_MIN, | |
53 INT_MAX, | |
54 INT_MIN, | |
55 INT_MAX, | |
56 base::TimeTicks()); | |
57 } | |
58 | |
59 void FlingAnimatorImpl::CancelFling() { | |
60 if (!is_active_) | |
61 return; | |
62 | |
63 is_active_ = false; | |
64 scroller_.AbortAnimation(); | |
65 } | |
66 | |
67 bool FlingAnimatorImpl::apply(double time, | |
68 blink::WebGestureCurveTarget* target) { | |
69 // If the fling has yet to start, simply return and report true to prevent | |
70 // fling termination. | |
71 if (time <= 0) | |
72 return true; | |
73 | |
74 const base::TimeTicks time_ticks = | |
75 base::TimeTicks() + base::TimeDelta::FromMicroseconds( | |
76 time * base::Time::kMicrosecondsPerSecond); | |
77 if (!scroller_.ComputeScrollOffset(time_ticks)) { | |
78 is_active_ = false; | |
79 return false; | |
80 } | |
81 | |
82 gfx::PointF current_position(scroller_.GetCurrX(), scroller_.GetCurrY()); | |
83 gfx::Vector2dF scroll_amount(current_position - last_position_); | |
84 last_position_ = current_position; | |
85 | |
86 // scrollBy() could delete this curve if the animation is over, so don't touch | |
87 // any member variables after making that call. | |
88 return target->scrollBy(blink::WebFloatSize(scroll_amount), | |
89 blink::WebFloatSize(scroller_.GetCurrVelocityX(), | |
90 scroller_.GetCurrVelocityY())); | |
91 } | |
92 | |
93 FlingAnimatorImpl* FlingAnimatorImpl::CreateAndroidGestureCurve( | |
94 const blink::WebFloatPoint& velocity, | |
95 const blink::WebSize&) { | |
96 FlingAnimatorImpl* gesture_curve = new FlingAnimatorImpl(); | |
97 gesture_curve->StartFling(velocity); | |
98 return gesture_curve; | |
99 } | |
100 | |
101 } // namespace content | |
OLD | NEW |