OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/views/animation/ink_drop_animation.h" | 5 #include "ui/views/animation/ink_drop_animation.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "third_party/skia/include/core/SkColor.h" | 11 #include "third_party/skia/include/core/SkColor.h" |
12 #include "ui/base/ui_base_switches.h" | 12 #include "ui/base/ui_base_switches.h" |
13 #include "ui/compositor/callback_layer_animation_observer.h" | 13 #include "ui/compositor/callback_layer_animation_observer.h" |
14 #include "ui/compositor/layer.h" | 14 #include "ui/compositor/layer.h" |
15 #include "ui/compositor/layer_animation_sequence.h" | 15 #include "ui/compositor/layer_animation_sequence.h" |
16 #include "ui/compositor/scoped_layer_animation_settings.h" | 16 #include "ui/compositor/scoped_layer_animation_settings.h" |
17 #include "ui/gfx/geometry/point3_f.h" | |
18 #include "ui/gfx/geometry/point_conversions.h" | |
19 #include "ui/gfx/geometry/point_f.h" | |
20 #include "ui/gfx/geometry/vector3d_f.h" | |
17 #include "ui/gfx/transform_util.h" | 21 #include "ui/gfx/transform_util.h" |
18 #include "ui/views/animation/ink_drop_animation_observer.h" | 22 #include "ui/views/animation/ink_drop_animation_observer.h" |
19 #include "ui/views/animation/ink_drop_painted_layer_delegates.h" | 23 #include "ui/views/animation/ink_drop_painted_layer_delegates.h" |
20 | 24 |
21 namespace { | 25 namespace { |
22 | 26 |
23 // The minimum scale factor to use when scaling rectangle layers. Smaller values | 27 // The minimum scale factor to use when scaling rectangle layers. Smaller values |
24 // were causing visual anomalies. | 28 // were causing visual anomalies. |
25 const float kMinimumRectScale = 0.0001f; | 29 const float kMinimumRectScale = 0.0001f; |
26 | 30 |
27 // The minimum scale factor to use when scaling circle layers. Smaller values | 31 // The minimum scale factor to use when scaling circle layers. Smaller values |
28 // were causing visual anomalies. | 32 // were causing visual anomalies. |
29 const float kMinimumCircleScale = 0.001f; | 33 const float kMinimumCircleScale = 0.001f; |
30 | 34 |
31 // The ink drop color. | 35 // The ink drop color. |
32 const SkColor kInkDropColor = SK_ColorBLACK; | 36 const SkColor kInkDropColor = SK_ColorBLACK; |
33 | 37 |
34 // The opacity of the ink drop when it is visible. | 38 // The opacity of the ink drop when it is visible. |
35 const float kVisibleOpacity = 0.14f; | 39 const float kVisibleOpacity = 0.09f; |
36 | 40 |
37 // The opacity of the ink drop when it is not visible. | 41 // The opacity of the ink drop when it is not visible. |
38 const float kHiddenOpacity = 0.0f; | 42 const float kHiddenOpacity = 0.0f; |
39 | 43 |
40 // Durations for the different InkDropState animations in milliseconds. | 44 // All the sub animations that are used to animate each of the InkDropStates. |
41 const int kHiddenStateAnimationDurationMs = 1; | 45 // These are used to get time durations with |
42 const int kActionPendingStateAnimationDurationMs = 500; | 46 // GetAnimationDuration(InkDropSubAnimations). Note that in general a sub |
43 const int kQuickActionStateAnimationDurationMs = 250; | 47 // animation defines the duration for either a transformation animation or an |
44 const int kSlowActionPendingStateAnimationDurationMs = 500; | 48 // opacity animation but there are some exceptions where an entire InkDropState |
45 const int kSlowActionStateAnimationDurationMs = 250; | 49 // animation consists of only 1 sub animation and it defines the duration for |
46 const int kActivatedStateAnimationDurationMs = 125; | 50 // both the transformation and opacity animations. |
47 const int kDeactivatedStateAnimationDurationMs = 250; | 51 enum InkDropSubAnimations { |
52 // Multi-purpose sub animation that is used for all InkDropState animations | |
53 // that fade out. It defines the portion of the animation where the ripple | |
54 // shape should be in it's final form and should pause at full opacity before | |
55 // fading out. | |
56 OPACITY_PAUSE_BEFORE_FADE_OUT, | |
57 | |
58 // HIDDEN sub animations. | |
59 | |
60 // The HIDDEN animation consists of a single sub animation that is fading out | |
61 // to a hidden opacity. | |
62 HIDDEN_FADE_OUT, | |
63 | |
64 // ACTION_PENDING sub animations. | |
65 | |
66 // The ACTION_PENDING sub animation that fades in to the visible opacity. | |
67 ACTION_PENDING_FADE_IN, | |
68 | |
69 // The ACTION_PENDING sub animation that transforms the shape to a | |
70 // |large_size_| circle. | |
71 ACTION_PENDING_TRANSFORM, | |
72 | |
73 // QUICK_ACTION sub animations. | |
74 | |
75 // The QUICK_ACTION sub animation that is fading in to a visible opacity. | |
76 QUICK_ACTION_FADE_IN, | |
77 | |
78 // The QUICK_ACTION sub animation that is fading out to a hidden opacity. | |
79 QUICK_ACTION_FADE_OUT, | |
80 | |
81 // The QUICK_ACTION sub animation that transforms the shape to a |large_size_| | |
82 // circle. | |
83 QUICK_ACTION_TRANSFORM, | |
84 | |
85 // The SLOW_ACTION_PENDING animation has only one sub animation which animates | |
86 // to a |small_size_| rounded rectangle at visible opacity. | |
87 SLOW_ACTION_PENDING, | |
88 | |
89 // SLOW_ACTION sub animations. | |
90 | |
91 // The SLOW_ACTION sub animation that is fading out to a hidden opacity. | |
92 SLOW_ACTION_FADE_OUT, | |
93 | |
94 // The SLOW_ACTION sub animation that transforms the shape to a |large_size_| | |
95 // rounded rectangle. | |
96 SLOW_ACTION_TRANSFORM, | |
97 | |
98 // ACTIVATED sub animations. | |
99 | |
100 // The ACTIVATED sub animation that is fading in to a visible opacity. | |
101 ACTIVATED_FADE_IN, | |
102 | |
103 // The ACTIVATED sub animation that transforms the shape to a |small_size_| | |
104 // rounded rectangle. | |
105 ACTIVATED_TRANSFORM, | |
106 | |
107 // DEACTIVATED sub animations. | |
108 | |
109 // The DEACTIVATED sub animation that is fading out to a hidden opacity. | |
110 DEACTIVATED_FADE_OUT, | |
111 | |
112 // The DEACTIVATED sub animation that transforms the shape to a |large_size_| | |
113 // rounded rectangle. | |
114 DEACTIVATED_TRANSFORM, | |
115 }; | |
116 | |
117 // Duration constants for InkDropStateSubAnimations. See the | |
118 // InkDropStateSubAnimations enum documentation for more info. | |
119 const int kOpacityPauseBeforeFadeOutDurationMs = 100; | |
120 const int kHiddenFadeOutAnimationDurationMs = 100; | |
121 const int kActionPendingFadeInAnimationDurationMs = 100; | |
122 const int kActionPendingTransformAnimationDurationMs = 300; | |
123 const int kQuickActionFadeInAnimationDurationMs = 100; | |
124 const int kQuickActionFadeOutAnimationDurationMs = 100; | |
125 const int kQuickActionTransformAnimationDurationMs = 300; | |
126 const int kSlowActionPendingAnimationDurationMs = 100; | |
127 const int kSlowActionFadeOutAnimationDurationMs = 100; | |
128 const int kSlowActionTransformAnimationDurationMs = 250; | |
129 const int kActivatedFadeInAnimationDurationMs = 75; | |
130 const int kActivatedTransformAnimationDurationMs = 150; | |
131 const int kDeactivatedFadeOutAnimationDurationMs = 100; | |
132 const int kDeactivatedTransformAnimationDurationMs = 100; | |
48 | 133 |
49 // A multiplicative factor used to slow down InkDropState animations. | 134 // A multiplicative factor used to slow down InkDropState animations. |
50 const int kSlowAnimationDurationFactor = 3; | 135 const int kSlowAnimationDurationFactor = 3; |
51 | 136 |
52 // Checks CommandLine switches to determine if the visual feedback should have | 137 // Checks CommandLine switches to determine if the visual feedback should have |
53 // a fast animations speed. | 138 // a fast animations speed. |
54 bool UseFastAnimations() { | 139 bool UseFastAnimations() { |
55 static bool fast = | 140 static bool fast = |
56 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 141 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
57 (::switches::kMaterialDesignInkDropAnimationSpeed)) != | 142 (::switches::kMaterialDesignInkDropAnimationSpeed)) != |
58 ::switches::kMaterialDesignInkDropAnimationSpeedSlow; | 143 ::switches::kMaterialDesignInkDropAnimationSpeedSlow; |
59 return fast; | 144 return fast; |
60 } | 145 } |
61 | 146 |
62 // Returns the InkDropState animation duration for the given |state|. | 147 // Returns the InkDropState sub animation duration for the given |state|. |
63 base::TimeDelta GetAnimationDuration(views::InkDropState state) { | 148 base::TimeDelta GetAnimationDuration(InkDropSubAnimations state) { |
64 int duration = 0; | 149 int duration = 0; |
65 switch (state) { | 150 switch (state) { |
66 case views::InkDropState::HIDDEN: | 151 case OPACITY_PAUSE_BEFORE_FADE_OUT: |
67 duration = kHiddenStateAnimationDurationMs; | 152 duration = kOpacityPauseBeforeFadeOutDurationMs; |
68 break; | 153 break; |
69 case views::InkDropState::ACTION_PENDING: | 154 case HIDDEN_FADE_OUT: |
70 duration = kActionPendingStateAnimationDurationMs; | 155 duration = kHiddenFadeOutAnimationDurationMs; |
varkha
2015/11/06 00:00:27
nit: Maybe drop Animation from all of those for co
bruthig
2015/11/11 18:11:20
Done.
| |
71 break; | 156 break; |
72 case views::InkDropState::QUICK_ACTION: | 157 case ACTION_PENDING_FADE_IN: |
73 duration = kQuickActionStateAnimationDurationMs; | 158 duration = kActionPendingFadeInAnimationDurationMs; |
74 break; | 159 break; |
75 case views::InkDropState::SLOW_ACTION_PENDING: | 160 case ACTION_PENDING_TRANSFORM: |
76 duration = kSlowActionPendingStateAnimationDurationMs; | 161 duration = kActionPendingTransformAnimationDurationMs; |
77 break; | 162 break; |
78 case views::InkDropState::SLOW_ACTION: | 163 case QUICK_ACTION_FADE_IN: |
79 duration = kSlowActionStateAnimationDurationMs; | 164 duration = kQuickActionFadeInAnimationDurationMs; |
80 break; | 165 break; |
81 case views::InkDropState::ACTIVATED: | 166 case QUICK_ACTION_FADE_OUT: |
82 duration = kActivatedStateAnimationDurationMs; | 167 duration = kQuickActionFadeOutAnimationDurationMs; |
83 break; | 168 break; |
84 case views::InkDropState::DEACTIVATED: | 169 case QUICK_ACTION_TRANSFORM: |
85 duration = kDeactivatedStateAnimationDurationMs; | 170 duration = kQuickActionTransformAnimationDurationMs; |
171 break; | |
172 case SLOW_ACTION_PENDING: | |
173 duration = kSlowActionPendingAnimationDurationMs; | |
174 break; | |
175 case SLOW_ACTION_TRANSFORM: | |
176 duration = kSlowActionTransformAnimationDurationMs; | |
177 break; | |
178 case SLOW_ACTION_FADE_OUT: | |
179 duration = kSlowActionFadeOutAnimationDurationMs; | |
180 break; | |
181 case ACTIVATED_FADE_IN: | |
182 duration = kActivatedFadeInAnimationDurationMs; | |
183 break; | |
184 case ACTIVATED_TRANSFORM: | |
185 duration = kActivatedTransformAnimationDurationMs; | |
186 break; | |
187 case DEACTIVATED_FADE_OUT: | |
188 duration = kDeactivatedFadeOutAnimationDurationMs; | |
189 break; | |
190 case DEACTIVATED_TRANSFORM: | |
191 duration = kDeactivatedTransformAnimationDurationMs; | |
86 break; | 192 break; |
87 } | 193 } |
88 | |
89 return base::TimeDelta::FromMilliseconds( | 194 return base::TimeDelta::FromMilliseconds( |
90 (UseFastAnimations() ? 1 : kSlowAnimationDurationFactor) * duration); | 195 (UseFastAnimations() ? 1 : kSlowAnimationDurationFactor) * duration); |
91 } | 196 } |
92 | 197 |
93 // Calculates a Transform for a circle layer. The transform will be set up to | 198 // Calculates a Transform for a circle layer. The transform will be set up to |
94 // translate the |drawn_center_point| to the origin, scale, and then translate | 199 // translate the |drawn_center_point| to the origin, scale, and then translate |
95 // to the target point defined by |target_center_x| and |target_center_y|. | 200 // to the target point defined by |target_center_x| and |target_center_y|. |
96 gfx::Transform CalculateCircleTransform(const gfx::Point& drawn_center_point, | 201 gfx::Transform CalculateCircleTransform(const gfx::Point& drawn_center_point, |
97 float scale, | 202 float scale, |
98 float target_center_x, | 203 float target_center_x, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
173 | 278 |
174 void InkDropAnimation::SetCenterPoint(const gfx::Point& center_point) { | 279 void InkDropAnimation::SetCenterPoint(const gfx::Point& center_point) { |
175 gfx::Transform transform; | 280 gfx::Transform transform; |
176 transform.Translate(center_point.x(), center_point.y()); | 281 transform.Translate(center_point.x(), center_point.y()); |
177 root_layer_->SetTransform(transform); | 282 root_layer_->SetTransform(transform); |
178 } | 283 } |
179 | 284 |
180 void InkDropAnimation::AnimateToStateInternal( | 285 void InkDropAnimation::AnimateToStateInternal( |
181 InkDropState ink_drop_state, | 286 InkDropState ink_drop_state, |
182 ui::LayerAnimationObserver* animation_observer) { | 287 ui::LayerAnimationObserver* animation_observer) { |
288 if (ink_drop_state_ == InkDropState::HIDDEN) { | |
289 // The HIDDEN state animations might still be in progress and we don't want | |
290 // to start the new ink drop sequence from that shape so snap the state to | |
291 // hidden. | |
292 AbortAllAnimations(); | |
293 SetStateToHidden(); | |
294 } | |
295 | |
183 ink_drop_state_ = ink_drop_state; | 296 ink_drop_state_ = ink_drop_state; |
184 | 297 |
185 if (ink_drop_state_ == InkDropState::HIDDEN) { | |
186 // Animating to the HIDDEN state doesn't actually use any | |
187 // LayerAnimationSequences so we need to explicitly abort any running ones | |
188 // so that observers receive an InkDropAnimationEnded() event for the | |
189 // running animation prior to receiving an InkDropAnimationStarted() event | |
190 // for the HIDDEN 'animation'. | |
191 AbortAllAnimations(); | |
192 root_layer_->SetVisible(false); | |
193 SetStateToHidden(); | |
194 return; | |
195 } | |
196 | |
197 InkDropTransforms transforms; | 298 InkDropTransforms transforms; |
198 root_layer_->SetVisible(true); | 299 root_layer_->SetVisible(true); |
199 | 300 |
200 switch (ink_drop_state_) { | 301 switch (ink_drop_state_) { |
201 case InkDropState::HIDDEN: | 302 case InkDropState::HIDDEN: |
202 // This case is handled above in a short circuit return. | 303 // Only the opacity is animated so we have to explicitly abort the other |
304 // running animations so that the LayerAnimationObservers are notified in | |
305 // the proper order. | |
306 AbortAllAnimations(); | |
varkha
2015/11/06 00:00:27
Why is this necessary given that we have called it
bruthig
2015/11/11 18:11:20
The call to AbortAllAnimations() above is guarded
| |
307 if (GetCurrentOpacity() != kHiddenOpacity) { | |
308 AnimateToOpacity(kHiddenOpacity, GetAnimationDuration(HIDDEN_FADE_OUT), | |
309 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
310 gfx::Tween::EASE_IN_OUT, animation_observer); | |
311 } | |
203 break; | 312 break; |
204 case InkDropState::ACTION_PENDING: | 313 case InkDropState::ACTION_PENDING: |
314 AnimateToOpacity(kVisibleOpacity, | |
315 GetAnimationDuration(ACTION_PENDING_FADE_IN), | |
316 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
317 gfx::Tween::EASE_IN, animation_observer); | |
205 CalculateCircleTransforms(large_size_, &transforms); | 318 CalculateCircleTransforms(large_size_, &transforms); |
206 AnimateToTransforms(transforms, kVisibleOpacity, | 319 AnimateToTransforms(transforms, |
207 GetAnimationDuration(InkDropState::ACTION_PENDING), | 320 GetAnimationDuration(ACTION_PENDING_TRANSFORM), |
208 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 321 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
209 animation_observer); | 322 gfx::Tween::EASE_OUT, animation_observer); |
210 break; | 323 break; |
211 case InkDropState::QUICK_ACTION: | 324 case InkDropState::QUICK_ACTION: { |
325 const float fade_in_ratio = 1.0f - GetCurrentOpacity() / kVisibleOpacity; | |
326 const base::TimeDelta fade_in_duration = | |
327 GetAnimationDuration(QUICK_ACTION_FADE_IN) * fade_in_ratio; | |
328 | |
329 const base::TimeDelta fade_out_duration = | |
330 GetAnimationDuration(QUICK_ACTION_FADE_OUT); | |
331 | |
332 GetCurrentTransforms(&transforms); | |
333 const float transformation_ratio = | |
334 1.0f - CalculateDistanceEstimateToQuickAction(transforms); | |
335 const base::TimeDelta transformation_duration = | |
336 GetAnimationDuration(QUICK_ACTION_TRANSFORM) * transformation_ratio; | |
337 | |
338 const base::TimeDelta visible_duration = | |
339 transformation_duration - fade_in_duration + | |
340 GetAnimationDuration(OPACITY_PAUSE_BEFORE_FADE_OUT); | |
341 | |
342 if (fade_in_duration.InMilliseconds() > 0) { | |
343 AnimateToOpacity(kVisibleOpacity, fade_in_duration, | |
344 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
345 gfx::Tween::EASE_IN, animation_observer); | |
346 } | |
347 | |
348 AnimateToOpacity(kVisibleOpacity, visible_duration, | |
349 ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, | |
350 gfx::Tween::LINEAR, animation_observer); | |
351 AnimateToOpacity(kHiddenOpacity, fade_out_duration, | |
352 ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, | |
353 gfx::Tween::EASE_OUT, animation_observer); | |
212 CalculateCircleTransforms(large_size_, &transforms); | 354 CalculateCircleTransforms(large_size_, &transforms); |
213 AnimateToTransforms(transforms, kHiddenOpacity, | 355 AnimateToTransforms(transforms, transformation_duration, |
214 GetAnimationDuration(InkDropState::QUICK_ACTION), | |
215 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 356 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
216 animation_observer); | 357 gfx::Tween::EASE_OUT, animation_observer); |
217 break; | 358 break; |
359 } | |
218 case InkDropState::SLOW_ACTION_PENDING: | 360 case InkDropState::SLOW_ACTION_PENDING: |
361 AnimateToOpacity(kVisibleOpacity, | |
362 GetAnimationDuration(SLOW_ACTION_PENDING), | |
363 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
364 gfx::Tween::EASE_IN, animation_observer); | |
219 CalculateRectTransforms(small_size_, small_corner_radius_, &transforms); | 365 CalculateRectTransforms(small_size_, small_corner_radius_, &transforms); |
220 AnimateToTransforms( | 366 AnimateToTransforms(transforms, GetAnimationDuration(SLOW_ACTION_PENDING), |
221 transforms, kVisibleOpacity, | 367 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
222 GetAnimationDuration(InkDropState::SLOW_ACTION_PENDING), | 368 gfx::Tween::EASE_IN_OUT, animation_observer); |
223 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
224 animation_observer); | |
225 break; | 369 break; |
226 case InkDropState::SLOW_ACTION: | 370 case InkDropState::SLOW_ACTION: |
371 AnimateToOpacity(kVisibleOpacity, | |
372 GetAnimationDuration(SLOW_ACTION_TRANSFORM) + | |
373 GetAnimationDuration(OPACITY_PAUSE_BEFORE_FADE_OUT), | |
374 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
375 gfx::Tween::EASE_IN, animation_observer); | |
376 AnimateToOpacity(kHiddenOpacity, | |
377 GetAnimationDuration(SLOW_ACTION_FADE_OUT), | |
378 ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, | |
379 gfx::Tween::EASE_IN_OUT, animation_observer); | |
227 CalculateRectTransforms(large_size_, large_corner_radius_, &transforms); | 380 CalculateRectTransforms(large_size_, large_corner_radius_, &transforms); |
228 AnimateToTransforms(transforms, kHiddenOpacity, | 381 AnimateToTransforms(transforms, |
229 GetAnimationDuration(InkDropState::SLOW_ACTION), | 382 GetAnimationDuration(SLOW_ACTION_TRANSFORM), |
230 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 383 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
231 animation_observer); | 384 gfx::Tween::EASE_IN_OUT, animation_observer); |
232 break; | 385 break; |
233 case InkDropState::ACTIVATED: | 386 case InkDropState::ACTIVATED: |
387 AnimateToOpacity(kVisibleOpacity, GetAnimationDuration(ACTIVATED_FADE_IN), | |
388 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
389 gfx::Tween::EASE_IN, animation_observer); | |
234 CalculateRectTransforms(small_size_, small_corner_radius_, &transforms); | 390 CalculateRectTransforms(small_size_, small_corner_radius_, &transforms); |
235 AnimateToTransforms(transforms, kVisibleOpacity, | 391 AnimateToTransforms(transforms, GetAnimationDuration(ACTIVATED_TRANSFORM), |
236 GetAnimationDuration(InkDropState::ACTIVATED), | |
237 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 392 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
238 animation_observer); | 393 gfx::Tween::EASE_OUT, animation_observer); |
239 break; | 394 break; |
240 case InkDropState::DEACTIVATED: | 395 case InkDropState::DEACTIVATED: |
396 AnimateToOpacity(kVisibleOpacity, | |
397 GetAnimationDuration(DEACTIVATED_TRANSFORM) + | |
398 GetAnimationDuration(OPACITY_PAUSE_BEFORE_FADE_OUT), | |
399 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
400 gfx::Tween::EASE_IN, animation_observer); | |
401 AnimateToOpacity(kHiddenOpacity, | |
402 GetAnimationDuration(DEACTIVATED_FADE_OUT), | |
403 ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, | |
404 gfx::Tween::EASE_IN_OUT, animation_observer); | |
241 CalculateRectTransforms(large_size_, large_corner_radius_, &transforms); | 405 CalculateRectTransforms(large_size_, large_corner_radius_, &transforms); |
242 AnimateToTransforms(transforms, kHiddenOpacity, | 406 AnimateToTransforms(transforms, |
243 GetAnimationDuration(InkDropState::DEACTIVATED), | 407 GetAnimationDuration(DEACTIVATED_TRANSFORM), |
244 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 408 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
245 animation_observer); | 409 gfx::Tween::EASE_IN_OUT, animation_observer); |
246 break; | 410 break; |
247 } | 411 } |
248 } | 412 } |
249 | 413 |
250 void InkDropAnimation::AnimateToTransforms( | 414 void InkDropAnimation::AnimateToTransforms( |
251 const InkDropTransforms transforms, | 415 const InkDropTransforms transforms, |
252 float opacity, | |
253 base::TimeDelta duration, | 416 base::TimeDelta duration, |
254 ui::LayerAnimator::PreemptionStrategy preemption_strategy, | 417 ui::LayerAnimator::PreemptionStrategy preemption_strategy, |
418 gfx::Tween::Type tween, | |
255 ui::LayerAnimationObserver* animation_observer) { | 419 ui::LayerAnimationObserver* animation_observer) { |
256 ui::LayerAnimator* root_animator = root_layer_->GetAnimator(); | |
257 ui::ScopedLayerAnimationSettings root_animation(root_animator); | |
258 root_animation.SetPreemptionStrategy(preemption_strategy); | |
259 ui::LayerAnimationElement* root_element = | |
260 ui::LayerAnimationElement::CreateOpacityElement(opacity, duration); | |
261 ui::LayerAnimationSequence* root_sequence = | |
262 new ui::LayerAnimationSequence(root_element); | |
263 | |
264 if (animation_observer) | |
265 root_sequence->AddObserver(animation_observer); | |
266 | |
267 root_animator->StartAnimation(root_sequence); | |
268 | |
269 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) { | 420 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) { |
270 ui::LayerAnimator* animator = painted_layers_[i]->GetAnimator(); | 421 ui::LayerAnimator* animator = painted_layers_[i]->GetAnimator(); |
271 ui::ScopedLayerAnimationSettings animation(animator); | 422 ui::ScopedLayerAnimationSettings animation(animator); |
272 animation.SetPreemptionStrategy(preemption_strategy); | 423 animation.SetPreemptionStrategy(preemption_strategy); |
424 animation.SetTweenType(tween); | |
273 ui::LayerAnimationElement* element = | 425 ui::LayerAnimationElement* element = |
274 ui::LayerAnimationElement::CreateTransformElement(transforms[i], | 426 ui::LayerAnimationElement::CreateTransformElement(transforms[i], |
275 duration); | 427 duration); |
276 ui::LayerAnimationSequence* sequence = | 428 ui::LayerAnimationSequence* sequence = |
277 new ui::LayerAnimationSequence(element); | 429 new ui::LayerAnimationSequence(element); |
278 | 430 |
279 if (animation_observer) | 431 if (animation_observer) |
280 sequence->AddObserver(animation_observer); | 432 sequence->AddObserver(animation_observer); |
281 | 433 |
282 animator->StartAnimation(sequence); | 434 animator->StartAnimation(sequence); |
283 } | 435 } |
284 } | 436 } |
285 | 437 |
286 void InkDropAnimation::SetStateToHidden() { | 438 void InkDropAnimation::SetStateToHidden() { |
287 InkDropTransforms transforms; | 439 InkDropTransforms transforms; |
288 // Using a size of 0x0 creates visual anomalies. | 440 // Using a size of 0x0 creates visual anomalies. |
289 CalculateCircleTransforms(gfx::Size(1, 1), &transforms); | 441 CalculateCircleTransforms(gfx::Size(1, 1), &transforms); |
290 SetTransforms(transforms); | 442 SetTransforms(transforms); |
291 SetOpacity(kHiddenOpacity); | 443 SetOpacity(kHiddenOpacity); |
444 root_layer_->SetVisible(false); | |
292 } | 445 } |
293 | 446 |
294 void InkDropAnimation::SetTransforms(const InkDropTransforms transforms) { | 447 void InkDropAnimation::SetTransforms(const InkDropTransforms transforms) { |
295 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) | 448 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) |
296 painted_layers_[i]->SetTransform(transforms[i]); | 449 painted_layers_[i]->SetTransform(transforms[i]); |
297 } | 450 } |
298 | 451 |
452 float InkDropAnimation::GetCurrentOpacity() const { | |
453 return root_layer_->opacity(); | |
454 } | |
455 | |
299 void InkDropAnimation::SetOpacity(float opacity) { | 456 void InkDropAnimation::SetOpacity(float opacity) { |
300 root_layer_->SetOpacity(opacity); | 457 root_layer_->SetOpacity(opacity); |
301 } | 458 } |
302 | 459 |
460 void InkDropAnimation::AnimateToOpacity( | |
461 float opacity, | |
462 base::TimeDelta duration, | |
463 ui::LayerAnimator::PreemptionStrategy preemption_strategy, | |
464 gfx::Tween::Type tween, | |
465 ui::LayerAnimationObserver* animation_observer) { | |
466 ui::LayerAnimator* animator = root_layer_->GetAnimator(); | |
467 ui::ScopedLayerAnimationSettings animation_settings(animator); | |
468 animation_settings.SetPreemptionStrategy(preemption_strategy); | |
469 animation_settings.SetTweenType(tween); | |
470 ui::LayerAnimationElement* animation_element = | |
471 ui::LayerAnimationElement::CreateOpacityElement(opacity, duration); | |
472 ui::LayerAnimationSequence* animation_sequence = | |
473 new ui::LayerAnimationSequence(animation_element); | |
474 | |
475 if (animation_observer) | |
476 animation_sequence->AddObserver(animation_observer); | |
477 | |
478 animator->StartAnimation(animation_sequence); | |
479 } | |
480 | |
303 void InkDropAnimation::CalculateCircleTransforms( | 481 void InkDropAnimation::CalculateCircleTransforms( |
304 const gfx::Size& size, | 482 const gfx::Size& size, |
305 InkDropTransforms* transforms_out) const { | 483 InkDropTransforms* transforms_out) const { |
306 CalculateRectTransforms(size, std::min(size.width(), size.height()) / 2.0f, | 484 CalculateRectTransforms(size, std::min(size.width(), size.height()) / 2.0f, |
307 transforms_out); | 485 transforms_out); |
308 } | 486 } |
309 | 487 |
310 void InkDropAnimation::CalculateRectTransforms( | 488 void InkDropAnimation::CalculateRectTransforms( |
311 const gfx::Size& size, | 489 const gfx::Size& size, |
312 float corner_radius, | 490 float corner_radius, |
313 InkDropTransforms* transforms_out) const { | 491 InkDropTransforms* transforms_out) const { |
314 DCHECK_GE(size.width() / 2.0f, corner_radius) | 492 DCHECK_GE(size.width() / 2.0f, corner_radius) |
315 << "The circle's diameter should not be greater than the total width."; | 493 << "The circle's diameter should not be greater than the total width."; |
316 DCHECK_GE(size.height() / 2.0f, corner_radius) | 494 DCHECK_GE(size.height() / 2.0f, corner_radius) |
317 << "The circle's diameter should not be greater than the total height."; | 495 << "The circle's diameter should not be greater than the total height."; |
318 | 496 |
319 // The shapes are drawn such that their center points are not at the origin. | 497 // The shapes are drawn such that their center points are not at the origin. |
320 // Thus we use the CalculateCircleTransform() and CalculateRectTransform() | 498 // Thus we use the CalculateCircleTransform() and CalculateRectTransform() |
321 // methods to calculate the complex Transforms. | 499 // methods to calculate the complex Transforms. |
322 | 500 |
323 const float circle_scale = std::max( | 501 const float circle_scale = std::max( |
324 kMinimumCircleScale, | 502 kMinimumCircleScale, |
325 corner_radius / static_cast<float>(circle_layer_delegate_->radius())); | 503 corner_radius / static_cast<float>(circle_layer_delegate_->radius())); |
326 | 504 |
327 const float circle_target_x_offset = size.width() / 2.0f - corner_radius; | 505 const float circle_target_x_offset = size.width() / 2.0f - corner_radius; |
328 const float circle_target_y_offset = size.height() / 2.0f - corner_radius; | 506 const float circle_target_y_offset = size.height() / 2.0f - corner_radius; |
329 | 507 |
330 (*transforms_out)[TOP_LEFT_CIRCLE] = CalculateCircleTransform( | 508 (*transforms_out)[TOP_LEFT_CIRCLE] = CalculateCircleTransform( |
331 painted_layers_[TOP_LEFT_CIRCLE]->bounds().CenterPoint(), circle_scale, | 509 ToRoundedPoint(circle_layer_delegate_->GetCenterPoint()), circle_scale, |
332 -circle_target_x_offset, -circle_target_y_offset); | 510 -circle_target_x_offset, -circle_target_y_offset); |
333 | 511 |
334 (*transforms_out)[TOP_RIGHT_CIRCLE] = CalculateCircleTransform( | 512 (*transforms_out)[TOP_RIGHT_CIRCLE] = CalculateCircleTransform( |
335 painted_layers_[TOP_RIGHT_CIRCLE]->bounds().CenterPoint(), circle_scale, | 513 ToRoundedPoint(circle_layer_delegate_->GetCenterPoint()), circle_scale, |
336 circle_target_x_offset, -circle_target_y_offset); | 514 circle_target_x_offset, -circle_target_y_offset); |
337 | 515 |
338 (*transforms_out)[BOTTOM_RIGHT_CIRCLE] = CalculateCircleTransform( | 516 (*transforms_out)[BOTTOM_RIGHT_CIRCLE] = CalculateCircleTransform( |
339 painted_layers_[BOTTOM_RIGHT_CIRCLE]->bounds().CenterPoint(), | 517 ToRoundedPoint(circle_layer_delegate_->GetCenterPoint()), circle_scale, |
340 circle_scale, circle_target_x_offset, circle_target_y_offset); | 518 circle_target_x_offset, circle_target_y_offset); |
341 | 519 |
342 (*transforms_out)[BOTTOM_LEFT_CIRCLE] = CalculateCircleTransform( | 520 (*transforms_out)[BOTTOM_LEFT_CIRCLE] = CalculateCircleTransform( |
343 painted_layers_[BOTTOM_LEFT_CIRCLE]->bounds().CenterPoint(), circle_scale, | 521 ToRoundedPoint(circle_layer_delegate_->GetCenterPoint()), circle_scale, |
344 -circle_target_x_offset, circle_target_y_offset); | 522 -circle_target_x_offset, circle_target_y_offset); |
345 | 523 |
346 const float rect_delegate_width = | 524 const float rect_delegate_width = |
347 static_cast<float>(rect_layer_delegate_->size().width()); | 525 static_cast<float>(rect_layer_delegate_->size().width()); |
348 const float rect_delegate_height = | 526 const float rect_delegate_height = |
349 static_cast<float>(rect_layer_delegate_->size().height()); | 527 static_cast<float>(rect_layer_delegate_->size().height()); |
350 | 528 |
351 (*transforms_out)[HORIZONTAL_RECT] = CalculateRectTransform( | 529 (*transforms_out)[HORIZONTAL_RECT] = CalculateRectTransform( |
352 painted_layers_[HORIZONTAL_RECT]->bounds().CenterPoint(), | 530 ToRoundedPoint(rect_layer_delegate_->GetCenterPoint()), |
353 std::max(kMinimumRectScale, size.width() / rect_delegate_width), | 531 std::max(kMinimumRectScale, size.width() / rect_delegate_width), |
354 std::max(kMinimumRectScale, | 532 std::max(kMinimumRectScale, |
355 (size.height() - 2.0f * corner_radius) / rect_delegate_height)); | 533 (size.height() - 2.0f * corner_radius) / rect_delegate_height)); |
356 | 534 |
357 (*transforms_out)[VERTICAL_RECT] = CalculateRectTransform( | 535 (*transforms_out)[VERTICAL_RECT] = CalculateRectTransform( |
358 painted_layers_[VERTICAL_RECT]->bounds().CenterPoint(), | 536 ToRoundedPoint(rect_layer_delegate_->GetCenterPoint()), |
359 std::max(kMinimumRectScale, | 537 std::max(kMinimumRectScale, |
360 (size.width() - 2.0f * corner_radius) / rect_delegate_width), | 538 (size.width() - 2.0f * corner_radius) / rect_delegate_width), |
361 std::max(kMinimumRectScale, size.height() / rect_delegate_height)); | 539 std::max(kMinimumRectScale, size.height() / rect_delegate_height)); |
362 } | 540 } |
363 | 541 |
364 void InkDropAnimation::GetCurrentTansforms( | 542 void InkDropAnimation::GetCurrentTransforms( |
365 InkDropTransforms* transforms_out) const { | 543 InkDropTransforms* transforms_out) const { |
366 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) | 544 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) |
367 (*transforms_out)[i] = painted_layers_[i]->GetTargetTransform(); | 545 (*transforms_out)[i] = painted_layers_[i]->transform(); |
368 } | 546 } |
369 | 547 |
370 void InkDropAnimation::AddPaintLayer(PaintedShape painted_shape) { | 548 void InkDropAnimation::AddPaintLayer(PaintedShape painted_shape) { |
371 ui::LayerDelegate* delegate = nullptr; | 549 ui::LayerDelegate* delegate = nullptr; |
372 switch (painted_shape) { | 550 switch (painted_shape) { |
373 case TOP_LEFT_CIRCLE: | 551 case TOP_LEFT_CIRCLE: |
374 case TOP_RIGHT_CIRCLE: | 552 case TOP_RIGHT_CIRCLE: |
375 case BOTTOM_RIGHT_CIRCLE: | 553 case BOTTOM_RIGHT_CIRCLE: |
376 case BOTTOM_LEFT_CIRCLE: | 554 case BOTTOM_LEFT_CIRCLE: |
377 delegate = circle_layer_delegate_.get(); | 555 delegate = circle_layer_delegate_.get(); |
(...skipping 19 matching lines...) Expand all Loading... | |
397 | 575 |
398 painted_layers_[painted_shape].reset(layer); | 576 painted_layers_[painted_shape].reset(layer); |
399 } | 577 } |
400 | 578 |
401 void InkDropAnimation::AbortAllAnimations() { | 579 void InkDropAnimation::AbortAllAnimations() { |
402 root_layer_->GetAnimator()->AbortAllAnimations(); | 580 root_layer_->GetAnimator()->AbortAllAnimations(); |
403 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) | 581 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) |
404 painted_layers_[i]->GetAnimator()->AbortAllAnimations(); | 582 painted_layers_[i]->GetAnimator()->AbortAllAnimations(); |
405 } | 583 } |
406 | 584 |
585 float InkDropAnimation::CalculateDistanceEstimateToQuickAction( | |
586 const InkDropTransforms& transforms) const { | |
587 gfx::Point3F circle_center_point = | |
588 gfx::Point3F(circle_layer_delegate_->GetCenterPoint()); | |
589 | |
590 gfx::Point3F circle_top_point( | |
591 circle_center_point.x(), | |
592 circle_center_point.y() - circle_layer_delegate_->radius(), 0); | |
593 | |
594 transforms[TOP_LEFT_CIRCLE].TransformPoint(&circle_center_point); | |
595 transforms[TOP_LEFT_CIRCLE].TransformPoint(&circle_top_point); | |
596 | |
597 // Calculate the ratio of how far the transformed circle's center point is | |
598 // from the destination compared to how far it can be. | |
599 const float center_point_distance_estimate = | |
600 1.0f - | |
601 gfx::Vector3dF(circle_center_point.x(), circle_center_point.y(), 0) | |
602 .Length() / | |
603 (gfx::Vector3dF(large_size_.width(), large_size_.height(), 0) | |
604 .Length() / | |
605 2.0f); | |
606 | |
607 // Calculate the ratio of how far the transformed circle's topmost point is | |
608 // from the destination compared to how far it can be. | |
609 const float top_point_distance_estimate = | |
610 -circle_top_point.y() / (large_size_.height() / 2.0f); | |
611 | |
612 return std::min(center_point_distance_estimate, top_point_distance_estimate); | |
613 } | |
614 | |
407 void InkDropAnimation::AnimationStartedCallback( | 615 void InkDropAnimation::AnimationStartedCallback( |
408 InkDropState ink_drop_state, | 616 InkDropState ink_drop_state, |
409 const ui::CallbackLayerAnimationObserver& observer) { | 617 const ui::CallbackLayerAnimationObserver& observer) { |
410 FOR_EACH_OBSERVER(InkDropAnimationObserver, observers_, | 618 FOR_EACH_OBSERVER(InkDropAnimationObserver, observers_, |
411 InkDropAnimationStarted(ink_drop_state)); | 619 InkDropAnimationStarted(ink_drop_state)); |
412 } | 620 } |
413 | 621 |
414 bool InkDropAnimation::AnimationEndedCallback( | 622 bool InkDropAnimation::AnimationEndedCallback( |
415 InkDropState ink_drop_state, | 623 InkDropState ink_drop_state, |
416 const ui::CallbackLayerAnimationObserver& observer) { | 624 const ui::CallbackLayerAnimationObserver& observer) { |
625 if (ink_drop_state == InkDropState::HIDDEN) | |
626 SetStateToHidden(); | |
627 | |
417 FOR_EACH_OBSERVER( | 628 FOR_EACH_OBSERVER( |
418 InkDropAnimationObserver, observers_, | 629 InkDropAnimationObserver, observers_, |
419 InkDropAnimationEnded(ink_drop_state, | 630 InkDropAnimationEnded(ink_drop_state, |
420 observer.aborted_count() | 631 observer.aborted_count() |
421 ? InkDropAnimationObserver::PRE_EMPTED | 632 ? InkDropAnimationObserver::PRE_EMPTED |
422 : InkDropAnimationObserver::SUCCESS)); | 633 : InkDropAnimationObserver::SUCCESS)); |
423 return true; | 634 return true; |
424 } | 635 } |
425 | 636 |
426 } // namespace views | 637 } // namespace views |
OLD | NEW |