OLD | NEW |
| (Empty) |
1 // Copyright 2013 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 "cc/animation/scrollbar_animation_controller_thinning.h" | |
6 | |
7 #include "base/time/time.h" | |
8 #include "cc/layers/layer_impl.h" | |
9 #include "cc/layers/scrollbar_layer_impl_base.h" | |
10 #include "cc/trees/layer_tree_impl.h" | |
11 | |
12 namespace { | |
13 const float kIdleThicknessScale = 0.4f; | |
14 const float kIdleOpacity = 0.7f; | |
15 const float kDefaultMouseMoveDistanceToTriggerAnimation = 25.f; | |
16 } | |
17 | |
18 namespace cc { | |
19 | |
20 scoped_ptr<ScrollbarAnimationControllerThinning> | |
21 ScrollbarAnimationControllerThinning::Create( | |
22 LayerImpl* scroll_layer, | |
23 ScrollbarAnimationControllerClient* client, | |
24 base::TimeDelta delay_before_starting, | |
25 base::TimeDelta resize_delay_before_starting, | |
26 base::TimeDelta duration) { | |
27 return make_scoped_ptr(new ScrollbarAnimationControllerThinning( | |
28 scroll_layer, client, delay_before_starting, resize_delay_before_starting, | |
29 duration)); | |
30 } | |
31 | |
32 ScrollbarAnimationControllerThinning::ScrollbarAnimationControllerThinning( | |
33 LayerImpl* scroll_layer, | |
34 ScrollbarAnimationControllerClient* client, | |
35 base::TimeDelta delay_before_starting, | |
36 base::TimeDelta resize_delay_before_starting, | |
37 base::TimeDelta duration) | |
38 : ScrollbarAnimationController(scroll_layer, | |
39 client, | |
40 delay_before_starting, | |
41 resize_delay_before_starting, | |
42 duration), | |
43 mouse_is_over_scrollbar_(false), | |
44 mouse_is_near_scrollbar_(false), | |
45 thickness_change_(NONE), | |
46 opacity_change_(NONE), | |
47 mouse_move_distance_to_trigger_animation_( | |
48 kDefaultMouseMoveDistanceToTriggerAnimation) { | |
49 ApplyOpacityAndThumbThicknessScale(kIdleOpacity, kIdleThicknessScale); | |
50 } | |
51 | |
52 ScrollbarAnimationControllerThinning::~ScrollbarAnimationControllerThinning() { | |
53 } | |
54 | |
55 void ScrollbarAnimationControllerThinning::RunAnimationFrame(float progress) { | |
56 float opacity = OpacityAtAnimationProgress(progress); | |
57 float thumb_thickness_scale = | |
58 ThumbThicknessScaleAtAnimationProgress(progress); | |
59 ApplyOpacityAndThumbThicknessScale(opacity, thumb_thickness_scale); | |
60 client_->SetNeedsRedrawForScrollbarAnimation(); | |
61 if (progress == 1.f) { | |
62 opacity_change_ = NONE; | |
63 thickness_change_ = NONE; | |
64 StopAnimation(); | |
65 } | |
66 } | |
67 | |
68 void ScrollbarAnimationControllerThinning::DidMouseMoveOffScrollbar() { | |
69 mouse_is_over_scrollbar_ = false; | |
70 mouse_is_near_scrollbar_ = false; | |
71 opacity_change_ = DECREASE; | |
72 thickness_change_ = DECREASE; | |
73 StartAnimation(); | |
74 } | |
75 | |
76 void ScrollbarAnimationControllerThinning::DidScrollUpdate(bool on_resize) { | |
77 ScrollbarAnimationController::DidScrollUpdate(on_resize); | |
78 ApplyOpacityAndThumbThicknessScale( | |
79 1, mouse_is_near_scrollbar_ ? 1.f : kIdleThicknessScale); | |
80 | |
81 if (!mouse_is_over_scrollbar_) | |
82 opacity_change_ = DECREASE; | |
83 } | |
84 | |
85 void ScrollbarAnimationControllerThinning::DidMouseMoveNear(float distance) { | |
86 bool mouse_is_over_scrollbar = distance == 0.0; | |
87 bool mouse_is_near_scrollbar = | |
88 distance < mouse_move_distance_to_trigger_animation_; | |
89 | |
90 if (mouse_is_over_scrollbar == mouse_is_over_scrollbar_ && | |
91 mouse_is_near_scrollbar == mouse_is_near_scrollbar_) | |
92 return; | |
93 | |
94 if (mouse_is_over_scrollbar_ != mouse_is_over_scrollbar) { | |
95 mouse_is_over_scrollbar_ = mouse_is_over_scrollbar; | |
96 opacity_change_ = mouse_is_over_scrollbar_ ? INCREASE : DECREASE; | |
97 } | |
98 | |
99 if (mouse_is_near_scrollbar_ != mouse_is_near_scrollbar) { | |
100 mouse_is_near_scrollbar_ = mouse_is_near_scrollbar; | |
101 thickness_change_ = mouse_is_near_scrollbar_ ? INCREASE : DECREASE; | |
102 } | |
103 | |
104 StartAnimation(); | |
105 } | |
106 | |
107 float ScrollbarAnimationControllerThinning::OpacityAtAnimationProgress( | |
108 float progress) { | |
109 if (opacity_change_ == NONE) | |
110 return mouse_is_over_scrollbar_ ? 1.f : kIdleOpacity; | |
111 float factor = opacity_change_ == INCREASE ? progress : (1.f - progress); | |
112 float ret = ((1.f - kIdleOpacity) * factor) + kIdleOpacity; | |
113 return ret; | |
114 } | |
115 | |
116 float ScrollbarAnimationControllerThinning:: | |
117 ThumbThicknessScaleAtAnimationProgress(float progress) { | |
118 if (thickness_change_ == NONE) | |
119 return mouse_is_near_scrollbar_ ? 1.f : kIdleThicknessScale; | |
120 float factor = thickness_change_ == INCREASE ? progress : (1.f - progress); | |
121 return ((1.f - kIdleThicknessScale) * factor) + kIdleThicknessScale; | |
122 } | |
123 | |
124 float ScrollbarAnimationControllerThinning::AdjustScale( | |
125 float new_value, | |
126 float current_value, | |
127 AnimationChange animation_change) { | |
128 if (animation_change == INCREASE && current_value > new_value) | |
129 return current_value; | |
130 if (animation_change == DECREASE && current_value < new_value) | |
131 return current_value; | |
132 return new_value; | |
133 } | |
134 | |
135 void ScrollbarAnimationControllerThinning::ApplyOpacityAndThumbThicknessScale( | |
136 float opacity, | |
137 float thumb_thickness_scale) { | |
138 if (!scroll_layer_->scrollbars()) | |
139 return; | |
140 | |
141 LayerImpl::ScrollbarSet* scrollbars = scroll_layer_->scrollbars(); | |
142 for (LayerImpl::ScrollbarSet::iterator it = scrollbars->begin(); | |
143 it != scrollbars->end(); ++it) { | |
144 ScrollbarLayerImplBase* scrollbar = *it; | |
145 if (scrollbar->is_overlay_scrollbar()) { | |
146 float effectiveOpacity = | |
147 scrollbar->CanScrollOrientation() | |
148 ? AdjustScale(opacity, scrollbar->opacity(), opacity_change_) | |
149 : 0; | |
150 | |
151 scrollbar->SetOpacity(effectiveOpacity); | |
152 scrollbar->SetThumbThicknessScaleFactor(AdjustScale( | |
153 thumb_thickness_scale, scrollbar->thumb_thickness_scale_factor(), | |
154 thickness_change_)); | |
155 } | |
156 } | |
157 } | |
158 | |
159 } // namespace cc | |
OLD | NEW |