Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1183)

Side by Side Diff: ui/views/animation/ink_drop_animation.cc

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

Powered by Google App Engine
This is Rietveld 408576698