Chromium Code Reviews| 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.14f; |
| 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 // The time taken to animate the ACTION_PENDING animation. |
| 41 const int kHiddenStateAnimationDurationMs = 1; | 45 const int kActionPendingAnimationDurationMs = 500; |
| 42 const int kActionPendingStateAnimationDurationMs = 500; | 46 |
| 43 const int kQuickActionStateAnimationDurationMs = 250; | 47 // The time taken to animate the visible portion of the QUICK_ACTION animation. |
| 44 const int kSlowActionPendingStateAnimationDurationMs = 500; | 48 const int kQuickActionVisibleAnimationDurationMs = 200; |
| 45 const int kSlowActionStateAnimationDurationMs = 250; | 49 |
| 46 const int kActivatedStateAnimationDurationMs = 125; | 50 // The time taken to animate the fade out portion of the QUICK_ACTION animation. |
| 47 const int kDeactivatedStateAnimationDurationMs = 250; | 51 const int kQuickActionFadeOutAnimationDurationMs = 100; |
| 52 | |
| 53 // The time taken to animate the SLOW_ACTION_PENDING animation. | |
| 54 const int kSlowActionPendingAnimationDurationMs = 100; | |
| 55 | |
| 56 // The time taken to animate the visible portion of the SLOW_ACTION animation. | |
| 57 const int kSlowActionVisibleAnimationDurationMs = 150; | |
| 58 | |
| 59 // The time taken to animate the fade out portion of the SLOW_ACTION animation. | |
| 60 const int kSlowActionFadeOutAnimationDurationMs = 100; | |
| 61 | |
| 62 // The time taken to animate the ACTIVATED animation. | |
| 63 const int kActivatedAnimationDurationMs = 125; | |
| 64 | |
| 65 // The time taken to animate the visible portion of the DEACTIVATED animation. | |
| 66 const int kDeactivatedVisibleAnimationDurationMs = 150; | |
| 67 | |
| 68 // The time taken to animate the fade out portion of the SLOW_ACTION animation. | |
|
varkha
2015/10/22 18:33:08
s/SLOW_ACTION/DEACTIVATED?
bruthig
2015/11/04 21:51:02
Done.
| |
| 69 const int kDeactivatedFadeOutAnimationDurationMs = 100; | |
| 48 | 70 |
| 49 // A multiplicative factor used to slow down InkDropState animations. | 71 // A multiplicative factor used to slow down InkDropState animations. |
| 50 const int kSlowAnimationDurationFactor = 3; | 72 const int kSlowAnimationDurationFactor = 3; |
| 51 | 73 |
| 52 // Checks CommandLine switches to determine if the visual feedback should have | 74 // Checks CommandLine switches to determine if the visual feedback should have |
| 53 // a fast animations speed. | 75 // a fast animations speed. |
| 54 bool UseFastAnimations() { | 76 bool UseFastAnimations() { |
| 55 static bool fast = | 77 static bool fast = |
| 56 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 78 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 57 (::switches::kMaterialDesignInkDropAnimationSpeed)) != | 79 (::switches::kMaterialDesignInkDropAnimationSpeed)) != |
| 58 ::switches::kMaterialDesignInkDropAnimationSpeedSlow; | 80 ::switches::kMaterialDesignInkDropAnimationSpeedSlow; |
| 59 return fast; | 81 return fast; |
| 60 } | 82 } |
| 61 | 83 |
| 62 // Returns the InkDropState animation duration for the given |state|. | 84 // All the sub animations that are used to animate each of the InkDropStates. |
| 63 base::TimeDelta GetAnimationDuration(views::InkDropState state) { | 85 enum InkDropSubAnimations { |
|
varkha
2015/10/22 18:33:07
Should this enum be above the time constants since
bruthig
2015/11/04 21:51:02
Done.
| |
| 86 // The ACTION_PENDING animation has only one sub animation which animates to a | |
| 87 // |large_size_| circle at visible opacity. | |
| 88 ACTION_PENDING, | |
| 89 | |
| 90 // The QUICK_ACTION animation consists of the two sub animations: | |
| 91 // QUICK_ACTION_VISIBLE, QUICK_ACTION_FADE_OUT. The final frame of the | |
| 92 // animation is a |large_size_| circle at hidden opacity. | |
| 93 | |
| 94 // The portion of the QUICK_ACTION animation that is at visible opacity. | |
| 95 QUICK_ACTION_VISIBLE, | |
|
varkha
2015/10/22 18:33:08
nit: White space after this line for consistency.
bruthig
2015/11/04 21:51:02
Done.
| |
| 96 // The portion of the QUICK_ACTION animation that is at fading out to a hidden | |
| 97 // opacity. | |
| 98 QUICK_ACTION_FADE_OUT, | |
| 99 | |
| 100 // The SLOW_ACTION_PENDING animation has only one sub animation which animates | |
| 101 // to a |small_size_| rounded rectangle at visible opacity. | |
| 102 SLOW_ACTION_PENDING, | |
| 103 | |
| 104 // The SLOW_ACTION animation consists of the two sub animations: | |
| 105 // SLOW_ACTION_VISIBLE, SLOW_ACTION_FADE_OUT. The final frame of the | |
| 106 // animation is a |large_size_| rounded rectangle at hidden opacity. | |
| 107 | |
| 108 // The portion of the SLOW_ACTION animation that is at visible opacity. | |
| 109 SLOW_ACTION_VISIBLE, | |
| 110 | |
| 111 // The portion of the SLOW_ACTION animation that is fading out to a hidden | |
| 112 // opacity. | |
| 113 SLOW_ACTION_FADE_OUT, | |
| 114 | |
| 115 // The ACTIVATED animation has only one sub animation which animates to a | |
| 116 // |small_size_| rounded rectangle at visible opacity. | |
| 117 ACTIVATED, | |
| 118 | |
| 119 // The DEACTIVATED animation consists of the two sub animations: | |
| 120 // DEACTIVATED_VISIBLE, DEACTIVATED_FADE_OUT. The final frame of the | |
| 121 // animation is a |large_size_| rounded rectangle at hidden opacity. | |
| 122 | |
| 123 // The portion of the DEACTIVATED animation that is at visible opacity. | |
| 124 DEACTIVATED_VISIBLE, | |
| 125 | |
| 126 // The portion of the DEACTIVATED animation that is fading out to a hidden | |
| 127 // opacity. | |
| 128 DEACTIVATED_FADE_OUT, | |
| 129 }; | |
| 130 | |
| 131 // // Returns the InkDropState animation duration for the given |state|. | |
|
varkha
2015/10/22 18:33:08
nit: extra //.
bruthig
2015/11/04 21:51:02
Done.
| |
| 132 base::TimeDelta GetAnimationDuration(InkDropSubAnimations state) { | |
| 64 int duration = 0; | 133 int duration = 0; |
| 65 switch (state) { | 134 switch (state) { |
| 66 case views::InkDropState::HIDDEN: | 135 case ACTION_PENDING: |
| 67 duration = kHiddenStateAnimationDurationMs; | 136 duration = kActionPendingAnimationDurationMs; |
| 68 break; | 137 break; |
| 69 case views::InkDropState::ACTION_PENDING: | 138 case QUICK_ACTION_VISIBLE: |
| 70 duration = kActionPendingStateAnimationDurationMs; | 139 duration = kQuickActionVisibleAnimationDurationMs; |
| 71 break; | 140 break; |
| 72 case views::InkDropState::QUICK_ACTION: | 141 case QUICK_ACTION_FADE_OUT: |
| 73 duration = kQuickActionStateAnimationDurationMs; | 142 duration = kQuickActionFadeOutAnimationDurationMs; |
| 74 break; | 143 break; |
| 75 case views::InkDropState::SLOW_ACTION_PENDING: | 144 case SLOW_ACTION_PENDING: |
| 76 duration = kSlowActionPendingStateAnimationDurationMs; | 145 duration = kSlowActionPendingAnimationDurationMs; |
| 77 break; | 146 break; |
| 78 case views::InkDropState::SLOW_ACTION: | 147 case SLOW_ACTION_VISIBLE: |
| 79 duration = kSlowActionStateAnimationDurationMs; | 148 duration = kSlowActionVisibleAnimationDurationMs; |
| 80 break; | 149 break; |
| 81 case views::InkDropState::ACTIVATED: | 150 case SLOW_ACTION_FADE_OUT: |
| 82 duration = kActivatedStateAnimationDurationMs; | 151 duration = kSlowActionFadeOutAnimationDurationMs; |
| 83 break; | 152 break; |
| 84 case views::InkDropState::DEACTIVATED: | 153 case ACTIVATED: |
| 85 duration = kDeactivatedStateAnimationDurationMs; | 154 duration = kActivatedAnimationDurationMs; |
| 155 break; | |
| 156 case DEACTIVATED_VISIBLE: | |
| 157 duration = kDeactivatedVisibleAnimationDurationMs; | |
| 158 break; | |
| 159 case DEACTIVATED_FADE_OUT: | |
| 160 duration = kDeactivatedFadeOutAnimationDurationMs; | |
| 86 break; | 161 break; |
| 87 } | 162 } |
| 88 | |
| 89 return base::TimeDelta::FromMilliseconds( | 163 return base::TimeDelta::FromMilliseconds( |
| 90 (UseFastAnimations() ? 1 : kSlowAnimationDurationFactor) * duration); | 164 (UseFastAnimations() ? 1 : kSlowAnimationDurationFactor) * duration); |
| 91 } | 165 } |
| 92 | 166 |
| 93 // Calculates a Transform for a circle layer. The transform will be set up to | 167 // 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 | 168 // 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|. | 169 // to the target point defined by |target_center_x| and |target_center_y|. |
| 96 gfx::Transform CalculateCircleTransform(const gfx::Point& drawn_center_point, | 170 gfx::Transform CalculateCircleTransform(const gfx::Point& drawn_center_point, |
| 97 float scale, | 171 float scale, |
| 98 float target_center_x, | 172 float target_center_x, |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 173 | 247 |
| 174 void InkDropAnimation::SetCenterPoint(const gfx::Point& center_point) { | 248 void InkDropAnimation::SetCenterPoint(const gfx::Point& center_point) { |
| 175 gfx::Transform transform; | 249 gfx::Transform transform; |
| 176 transform.Translate(center_point.x(), center_point.y()); | 250 transform.Translate(center_point.x(), center_point.y()); |
| 177 root_layer_->SetTransform(transform); | 251 root_layer_->SetTransform(transform); |
| 178 } | 252 } |
| 179 | 253 |
| 180 void InkDropAnimation::AnimateToStateInternal( | 254 void InkDropAnimation::AnimateToStateInternal( |
| 181 InkDropState ink_drop_state, | 255 InkDropState ink_drop_state, |
| 182 ui::LayerAnimationObserver* animation_observer) { | 256 ui::LayerAnimationObserver* animation_observer) { |
| 257 const InkDropState previous_ink_drop_state_ = ink_drop_state_; | |
| 183 ink_drop_state_ = ink_drop_state; | 258 ink_drop_state_ = ink_drop_state; |
| 184 | 259 |
| 185 if (ink_drop_state_ == InkDropState::HIDDEN) { | 260 if (ink_drop_state_ == InkDropState::HIDDEN) { |
| 186 // Animating to the HIDDEN state doesn't actually use any | 261 // Animating to the HIDDEN state doesn't actually use any |
| 187 // LayerAnimationSequences so we need to explicitly abort any running ones | 262 // LayerAnimationSequences so we need to explicitly abort any running ones |
| 188 // so that observers receive an InkDropAnimationEnded() event for the | 263 // so that observers receive an InkDropAnimationEnded() event for the |
| 189 // running animation prior to receiving an InkDropAnimationStarted() event | 264 // running animation prior to receiving an InkDropAnimationStarted() event |
| 190 // for the HIDDEN 'animation'. | 265 // for the HIDDEN 'animation'. |
| 191 AbortAllAnimations(); | 266 AbortAllAnimations(); |
| 192 root_layer_->SetVisible(false); | |
| 193 SetStateToHidden(); | 267 SetStateToHidden(); |
| 194 return; | 268 return; |
| 195 } | 269 } |
| 196 | 270 |
| 197 InkDropTransforms transforms; | 271 InkDropTransforms transforms; |
| 198 root_layer_->SetVisible(true); | 272 root_layer_->SetVisible(true); |
| 199 | 273 |
| 200 switch (ink_drop_state_) { | 274 switch (ink_drop_state_) { |
| 201 case InkDropState::HIDDEN: | 275 case InkDropState::HIDDEN: |
| 202 // This case is handled above in a short circuit return. | 276 // This case is handled above in a short circuit return. |
| 203 break; | 277 break; |
| 204 case InkDropState::ACTION_PENDING: | 278 case InkDropState::ACTION_PENDING: |
|
varkha
2015/10/22 18:33:08
General comment in this method. The code seems lik
bruthig
2015/11/04 21:51:02
I'm not so sure how to reduce the amount of code h
| |
| 279 AnimateToOpacity(kVisibleOpacity, GetAnimationDuration(ACTION_PENDING), | |
| 280 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
| 281 animation_observer); | |
| 205 CalculateCircleTransforms(large_size_, &transforms); | 282 CalculateCircleTransforms(large_size_, &transforms); |
| 206 AnimateToTransforms(transforms, kVisibleOpacity, | 283 AnimateToTransforms(transforms, GetAnimationDuration(ACTION_PENDING), |
| 207 GetAnimationDuration(InkDropState::ACTION_PENDING), | |
| 208 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 284 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
| 209 animation_observer); | 285 animation_observer); |
| 210 break; | 286 break; |
| 211 case InkDropState::QUICK_ACTION: | 287 case InkDropState::QUICK_ACTION: { |
| 288 float visible_duration_ratio = 1.0f; | |
| 289 | |
| 290 // If the previous state is ACTION_PENDING we don't want the QUICK_ACTION | |
| 291 // to take the full duration because the expanding ripple noticably | |
| 292 // changes speed. | |
| 293 if (previous_ink_drop_state_ == InkDropState::ACTION_PENDING) { | |
| 294 GetCurrentTransforms(&transforms); | |
| 295 visible_duration_ratio = | |
| 296 visible_duration_ratio - | |
| 297 CalculateDistanceEstimateToQuickAction(transforms); | |
| 298 } | |
| 299 | |
| 300 const base::TimeDelta visible_duration = | |
| 301 GetAnimationDuration(QUICK_ACTION_VISIBLE) * visible_duration_ratio; | |
| 302 | |
| 303 ui::LayerAnimator::PreemptionStrategy fade_out_preemption_strategy = | |
| 304 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET; | |
| 305 | |
| 306 base::TimeDelta total_effective_duration = | |
| 307 GetAnimationDuration(QUICK_ACTION_FADE_OUT); | |
| 308 | |
| 309 if (visible_duration.InMilliseconds() > 0) { | |
| 310 fade_out_preemption_strategy = ui::LayerAnimator::ENQUEUE_NEW_ANIMATION; | |
| 311 total_effective_duration += visible_duration; | |
| 312 AnimateToOpacity(kVisibleOpacity, visible_duration, | |
| 313 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
| 314 animation_observer); | |
| 315 } | |
| 316 | |
| 317 AnimateToOpacity(kHiddenOpacity, | |
| 318 GetAnimationDuration(QUICK_ACTION_FADE_OUT), | |
| 319 fade_out_preemption_strategy, animation_observer); | |
| 212 CalculateCircleTransforms(large_size_, &transforms); | 320 CalculateCircleTransforms(large_size_, &transforms); |
| 213 AnimateToTransforms(transforms, kHiddenOpacity, | 321 AnimateToTransforms(transforms, total_effective_duration, |
| 214 GetAnimationDuration(InkDropState::QUICK_ACTION), | |
| 215 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 322 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
| 216 animation_observer); | 323 animation_observer); |
| 217 break; | 324 break; |
| 325 } | |
| 218 case InkDropState::SLOW_ACTION_PENDING: | 326 case InkDropState::SLOW_ACTION_PENDING: |
| 327 AnimateToOpacity(kVisibleOpacity, | |
| 328 GetAnimationDuration(SLOW_ACTION_PENDING), | |
| 329 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
| 330 animation_observer); | |
| 219 CalculateRectTransforms(small_size_, small_corner_radius_, &transforms); | 331 CalculateRectTransforms(small_size_, small_corner_radius_, &transforms); |
| 220 AnimateToTransforms( | 332 AnimateToTransforms(transforms, GetAnimationDuration(SLOW_ACTION_PENDING), |
| 221 transforms, kVisibleOpacity, | 333 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
| 222 GetAnimationDuration(InkDropState::SLOW_ACTION_PENDING), | 334 animation_observer); |
| 223 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
| 224 animation_observer); | |
| 225 break; | 335 break; |
| 226 case InkDropState::SLOW_ACTION: | 336 case InkDropState::SLOW_ACTION: |
| 337 AnimateToOpacity(kVisibleOpacity, | |
| 338 GetAnimationDuration(SLOW_ACTION_VISIBLE), | |
| 339 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
| 340 animation_observer); | |
| 341 AnimateToOpacity( | |
| 342 kHiddenOpacity, GetAnimationDuration(SLOW_ACTION_FADE_OUT), | |
| 343 ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, animation_observer); | |
| 227 CalculateRectTransforms(large_size_, large_corner_radius_, &transforms); | 344 CalculateRectTransforms(large_size_, large_corner_radius_, &transforms); |
| 228 AnimateToTransforms(transforms, kHiddenOpacity, | 345 AnimateToTransforms(transforms, |
| 229 GetAnimationDuration(InkDropState::SLOW_ACTION), | 346 GetAnimationDuration(SLOW_ACTION_VISIBLE) + |
| 347 GetAnimationDuration(SLOW_ACTION_FADE_OUT), | |
| 230 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 348 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
| 231 animation_observer); | 349 animation_observer); |
| 232 break; | 350 break; |
| 233 case InkDropState::ACTIVATED: | 351 case InkDropState::ACTIVATED: |
| 352 AnimateToOpacity(kVisibleOpacity, GetAnimationDuration(ACTIVATED), | |
| 353 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
| 354 animation_observer); | |
| 234 CalculateRectTransforms(small_size_, small_corner_radius_, &transforms); | 355 CalculateRectTransforms(small_size_, small_corner_radius_, &transforms); |
| 235 AnimateToTransforms(transforms, kVisibleOpacity, | 356 AnimateToTransforms(transforms, GetAnimationDuration(ACTIVATED), |
| 236 GetAnimationDuration(InkDropState::ACTIVATED), | |
| 237 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 357 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
| 238 animation_observer); | 358 animation_observer); |
| 239 break; | 359 break; |
| 240 case InkDropState::DEACTIVATED: | 360 case InkDropState::DEACTIVATED: |
| 361 AnimateToOpacity(kVisibleOpacity, | |
| 362 GetAnimationDuration(DEACTIVATED_VISIBLE), | |
| 363 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | |
| 364 animation_observer); | |
| 365 AnimateToOpacity( | |
| 366 kHiddenOpacity, GetAnimationDuration(DEACTIVATED_FADE_OUT), | |
| 367 ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, animation_observer); | |
| 241 CalculateRectTransforms(large_size_, large_corner_radius_, &transforms); | 368 CalculateRectTransforms(large_size_, large_corner_radius_, &transforms); |
| 242 AnimateToTransforms(transforms, kHiddenOpacity, | 369 AnimateToTransforms(transforms, |
| 243 GetAnimationDuration(InkDropState::DEACTIVATED), | 370 GetAnimationDuration(DEACTIVATED_VISIBLE) + |
| 371 GetAnimationDuration(DEACTIVATED_FADE_OUT), | |
| 244 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 372 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
| 245 animation_observer); | 373 animation_observer); |
| 246 break; | 374 break; |
| 247 } | 375 } |
| 248 } | 376 } |
| 249 | 377 |
| 250 void InkDropAnimation::AnimateToTransforms( | 378 void InkDropAnimation::AnimateToTransforms( |
| 251 const InkDropTransforms transforms, | 379 const InkDropTransforms transforms, |
| 252 float opacity, | |
| 253 base::TimeDelta duration, | 380 base::TimeDelta duration, |
| 254 ui::LayerAnimator::PreemptionStrategy preemption_strategy, | 381 ui::LayerAnimator::PreemptionStrategy preemption_strategy, |
| 255 ui::LayerAnimationObserver* animation_observer) { | 382 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) { | 383 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) { |
| 270 ui::LayerAnimator* animator = painted_layers_[i]->GetAnimator(); | 384 ui::LayerAnimator* animator = painted_layers_[i]->GetAnimator(); |
| 271 ui::ScopedLayerAnimationSettings animation(animator); | 385 ui::ScopedLayerAnimationSettings animation(animator); |
| 272 animation.SetPreemptionStrategy(preemption_strategy); | 386 animation.SetPreemptionStrategy(preemption_strategy); |
| 273 ui::LayerAnimationElement* element = | 387 ui::LayerAnimationElement* element = |
| 274 ui::LayerAnimationElement::CreateTransformElement(transforms[i], | 388 ui::LayerAnimationElement::CreateTransformElement(transforms[i], |
| 275 duration); | 389 duration); |
| 276 ui::LayerAnimationSequence* sequence = | 390 ui::LayerAnimationSequence* sequence = |
| 277 new ui::LayerAnimationSequence(element); | 391 new ui::LayerAnimationSequence(element); |
| 278 | 392 |
| 279 if (animation_observer) | 393 if (animation_observer) |
| 280 sequence->AddObserver(animation_observer); | 394 sequence->AddObserver(animation_observer); |
| 281 | 395 |
| 282 animator->StartAnimation(sequence); | 396 animator->StartAnimation(sequence); |
| 283 } | 397 } |
| 284 } | 398 } |
| 285 | 399 |
| 286 void InkDropAnimation::SetStateToHidden() { | 400 void InkDropAnimation::SetStateToHidden() { |
| 287 InkDropTransforms transforms; | 401 InkDropTransforms transforms; |
| 288 // Using a size of 0x0 creates visual anomalies. | 402 // Using a size of 0x0 creates visual anomalies. |
| 289 CalculateCircleTransforms(gfx::Size(1, 1), &transforms); | 403 CalculateCircleTransforms(gfx::Size(1, 1), &transforms); |
| 290 SetTransforms(transforms); | 404 SetTransforms(transforms); |
| 291 SetOpacity(kHiddenOpacity); | 405 SetOpacity(kHiddenOpacity); |
| 406 root_layer_->SetVisible(false); | |
|
varkha
2015/10/22 18:33:07
Just a question: did it matter that this is now th
bruthig
2015/11/04 21:51:02
Nope
| |
| 292 } | 407 } |
| 293 | 408 |
| 294 void InkDropAnimation::SetTransforms(const InkDropTransforms transforms) { | 409 void InkDropAnimation::SetTransforms(const InkDropTransforms transforms) { |
| 295 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) | 410 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) |
| 296 painted_layers_[i]->SetTransform(transforms[i]); | 411 painted_layers_[i]->SetTransform(transforms[i]); |
| 297 } | 412 } |
| 298 | 413 |
| 299 void InkDropAnimation::SetOpacity(float opacity) { | 414 void InkDropAnimation::SetOpacity(float opacity) { |
| 300 root_layer_->SetOpacity(opacity); | 415 root_layer_->SetOpacity(opacity); |
| 301 } | 416 } |
| 302 | 417 |
| 418 void InkDropAnimation::AnimateToOpacity( | |
| 419 float opacity, | |
| 420 base::TimeDelta duration, | |
| 421 ui::LayerAnimator::PreemptionStrategy preemption_strategy, | |
| 422 ui::LayerAnimationObserver* animation_observer) { | |
| 423 ui::LayerAnimator* animator = root_layer_->GetAnimator(); | |
| 424 ui::ScopedLayerAnimationSettings animation_settings(animator); | |
| 425 animation_settings.SetPreemptionStrategy(preemption_strategy); | |
| 426 ui::LayerAnimationElement* animation_element = | |
| 427 ui::LayerAnimationElement::CreateOpacityElement(opacity, duration); | |
| 428 ui::LayerAnimationSequence* animation_sequence = | |
| 429 new ui::LayerAnimationSequence(animation_element); | |
| 430 | |
| 431 if (animation_observer) | |
| 432 animation_sequence->AddObserver(animation_observer); | |
| 433 | |
| 434 animator->StartAnimation(animation_sequence); | |
| 435 } | |
| 436 | |
| 303 void InkDropAnimation::CalculateCircleTransforms( | 437 void InkDropAnimation::CalculateCircleTransforms( |
| 304 const gfx::Size& size, | 438 const gfx::Size& size, |
| 305 InkDropTransforms* transforms_out) const { | 439 InkDropTransforms* transforms_out) const { |
| 306 CalculateRectTransforms(size, std::min(size.width(), size.height()) / 2.0f, | 440 CalculateRectTransforms(size, std::min(size.width(), size.height()) / 2.0f, |
| 307 transforms_out); | 441 transforms_out); |
| 308 } | 442 } |
| 309 | 443 |
| 310 void InkDropAnimation::CalculateRectTransforms( | 444 void InkDropAnimation::CalculateRectTransforms( |
| 311 const gfx::Size& size, | 445 const gfx::Size& size, |
| 312 float corner_radius, | 446 float corner_radius, |
| 313 InkDropTransforms* transforms_out) const { | 447 InkDropTransforms* transforms_out) const { |
| 314 DCHECK_GE(size.width() / 2.0f, corner_radius) | 448 DCHECK_GE(size.width() / 2.0f, corner_radius) |
| 315 << "The circle's diameter should not be greater than the total width."; | 449 << "The circle's diameter should not be greater than the total width."; |
| 316 DCHECK_GE(size.height() / 2.0f, corner_radius) | 450 DCHECK_GE(size.height() / 2.0f, corner_radius) |
| 317 << "The circle's diameter should not be greater than the total height."; | 451 << "The circle's diameter should not be greater than the total height."; |
| 318 | 452 |
| 319 // The shapes are drawn such that their center points are not at the origin. | 453 // The shapes are drawn such that their center points are not at the origin. |
| 320 // Thus we use the CalculateCircleTransform() and CalculateRectTransform() | 454 // Thus we use the CalculateCircleTransform() and CalculateRectTransform() |
| 321 // methods to calculate the complex Transforms. | 455 // methods to calculate the complex Transforms. |
| 322 | 456 |
| 323 const float circle_scale = std::max( | 457 const float circle_scale = std::max( |
| 324 kMinimumCircleScale, | 458 kMinimumCircleScale, |
| 325 corner_radius / static_cast<float>(circle_layer_delegate_->radius())); | 459 corner_radius / static_cast<float>(circle_layer_delegate_->radius())); |
| 326 | 460 |
| 327 const float circle_target_x_offset = size.width() / 2.0f - corner_radius; | 461 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; | 462 const float circle_target_y_offset = size.height() / 2.0f - corner_radius; |
| 329 | 463 |
| 330 (*transforms_out)[TOP_LEFT_CIRCLE] = CalculateCircleTransform( | 464 (*transforms_out)[TOP_LEFT_CIRCLE] = CalculateCircleTransform( |
| 331 painted_layers_[TOP_LEFT_CIRCLE]->bounds().CenterPoint(), circle_scale, | 465 ToRoundedPoint(circle_layer_delegate_->GetCenterPoint()), circle_scale, |
| 332 -circle_target_x_offset, -circle_target_y_offset); | 466 -circle_target_x_offset, -circle_target_y_offset); |
| 333 | 467 |
| 334 (*transforms_out)[TOP_RIGHT_CIRCLE] = CalculateCircleTransform( | 468 (*transforms_out)[TOP_RIGHT_CIRCLE] = CalculateCircleTransform( |
| 335 painted_layers_[TOP_RIGHT_CIRCLE]->bounds().CenterPoint(), circle_scale, | 469 ToRoundedPoint(circle_layer_delegate_->GetCenterPoint()), circle_scale, |
| 336 circle_target_x_offset, -circle_target_y_offset); | 470 circle_target_x_offset, -circle_target_y_offset); |
| 337 | 471 |
| 338 (*transforms_out)[BOTTOM_RIGHT_CIRCLE] = CalculateCircleTransform( | 472 (*transforms_out)[BOTTOM_RIGHT_CIRCLE] = CalculateCircleTransform( |
| 339 painted_layers_[BOTTOM_RIGHT_CIRCLE]->bounds().CenterPoint(), | 473 ToRoundedPoint(circle_layer_delegate_->GetCenterPoint()), circle_scale, |
| 340 circle_scale, circle_target_x_offset, circle_target_y_offset); | 474 circle_target_x_offset, circle_target_y_offset); |
| 341 | 475 |
| 342 (*transforms_out)[BOTTOM_LEFT_CIRCLE] = CalculateCircleTransform( | 476 (*transforms_out)[BOTTOM_LEFT_CIRCLE] = CalculateCircleTransform( |
| 343 painted_layers_[BOTTOM_LEFT_CIRCLE]->bounds().CenterPoint(), circle_scale, | 477 ToRoundedPoint(circle_layer_delegate_->GetCenterPoint()), circle_scale, |
| 344 -circle_target_x_offset, circle_target_y_offset); | 478 -circle_target_x_offset, circle_target_y_offset); |
| 345 | 479 |
| 346 const float rect_delegate_width = | 480 const float rect_delegate_width = |
| 347 static_cast<float>(rect_layer_delegate_->size().width()); | 481 static_cast<float>(rect_layer_delegate_->size().width()); |
| 348 const float rect_delegate_height = | 482 const float rect_delegate_height = |
| 349 static_cast<float>(rect_layer_delegate_->size().height()); | 483 static_cast<float>(rect_layer_delegate_->size().height()); |
| 350 | 484 |
| 351 (*transforms_out)[HORIZONTAL_RECT] = CalculateRectTransform( | 485 (*transforms_out)[HORIZONTAL_RECT] = CalculateRectTransform( |
| 352 painted_layers_[HORIZONTAL_RECT]->bounds().CenterPoint(), | 486 ToRoundedPoint(rect_layer_delegate_->GetCenterPoint()), |
| 353 std::max(kMinimumRectScale, size.width() / rect_delegate_width), | 487 std::max(kMinimumRectScale, size.width() / rect_delegate_width), |
| 354 std::max(kMinimumRectScale, | 488 std::max(kMinimumRectScale, |
| 355 (size.height() - 2.0f * corner_radius) / rect_delegate_height)); | 489 (size.height() - 2.0f * corner_radius) / rect_delegate_height)); |
| 356 | 490 |
| 357 (*transforms_out)[VERTICAL_RECT] = CalculateRectTransform( | 491 (*transforms_out)[VERTICAL_RECT] = CalculateRectTransform( |
| 358 painted_layers_[VERTICAL_RECT]->bounds().CenterPoint(), | 492 ToRoundedPoint(rect_layer_delegate_->GetCenterPoint()), |
| 359 std::max(kMinimumRectScale, | 493 std::max(kMinimumRectScale, |
| 360 (size.width() - 2.0f * corner_radius) / rect_delegate_width), | 494 (size.width() - 2.0f * corner_radius) / rect_delegate_width), |
| 361 std::max(kMinimumRectScale, size.height() / rect_delegate_height)); | 495 std::max(kMinimumRectScale, size.height() / rect_delegate_height)); |
| 362 } | 496 } |
| 363 | 497 |
| 364 void InkDropAnimation::GetCurrentTansforms( | 498 void InkDropAnimation::GetCurrentTransforms( |
| 365 InkDropTransforms* transforms_out) const { | 499 InkDropTransforms* transforms_out) const { |
| 366 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) | 500 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) |
| 367 (*transforms_out)[i] = painted_layers_[i]->GetTargetTransform(); | 501 (*transforms_out)[i] = painted_layers_[i]->transform(); |
| 368 } | 502 } |
| 369 | 503 |
| 370 void InkDropAnimation::AddPaintLayer(PaintedShape painted_shape) { | 504 void InkDropAnimation::AddPaintLayer(PaintedShape painted_shape) { |
| 371 ui::LayerDelegate* delegate = nullptr; | 505 ui::LayerDelegate* delegate = nullptr; |
| 372 switch (painted_shape) { | 506 switch (painted_shape) { |
| 373 case TOP_LEFT_CIRCLE: | 507 case TOP_LEFT_CIRCLE: |
| 374 case TOP_RIGHT_CIRCLE: | 508 case TOP_RIGHT_CIRCLE: |
| 375 case BOTTOM_RIGHT_CIRCLE: | 509 case BOTTOM_RIGHT_CIRCLE: |
| 376 case BOTTOM_LEFT_CIRCLE: | 510 case BOTTOM_LEFT_CIRCLE: |
| 377 delegate = circle_layer_delegate_.get(); | 511 delegate = circle_layer_delegate_.get(); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 397 | 531 |
| 398 painted_layers_[painted_shape].reset(layer); | 532 painted_layers_[painted_shape].reset(layer); |
| 399 } | 533 } |
| 400 | 534 |
| 401 void InkDropAnimation::AbortAllAnimations() { | 535 void InkDropAnimation::AbortAllAnimations() { |
| 402 root_layer_->GetAnimator()->AbortAllAnimations(); | 536 root_layer_->GetAnimator()->AbortAllAnimations(); |
| 403 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) | 537 for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) |
| 404 painted_layers_[i]->GetAnimator()->AbortAllAnimations(); | 538 painted_layers_[i]->GetAnimator()->AbortAllAnimations(); |
| 405 } | 539 } |
| 406 | 540 |
| 541 float InkDropAnimation::CalculateDistanceEstimateToQuickAction( | |
| 542 const InkDropTransforms& transforms) const { | |
| 543 gfx::Point3F circle_center_point = | |
| 544 gfx::Point3F(circle_layer_delegate_->GetCenterPoint()); | |
| 545 | |
| 546 gfx::Point3F circle_top_point( | |
| 547 circle_center_point.x(), | |
| 548 circle_center_point.y() - circle_layer_delegate_->radius(), 0); | |
| 549 | |
| 550 transforms[TOP_LEFT_CIRCLE].TransformPoint(&circle_center_point); | |
| 551 transforms[TOP_LEFT_CIRCLE].TransformPoint(&circle_top_point); | |
| 552 | |
| 553 // Calculate the ratio of how far the transformed circle's center point is | |
| 554 // from the destination compared to how far it can be. | |
| 555 const float center_point_distance_estimate = | |
| 556 1.0f - | |
| 557 gfx::Vector3dF(circle_center_point.x(), circle_center_point.y(), 0) | |
| 558 .Length() / | |
|
varkha
2015/10/22 18:33:08
nit: indentation looks a bit odd here.
bruthig
2015/11/04 21:51:02
This is the result of 'git cl format'.
| |
| 559 (gfx::Vector3dF(static_cast<float>(large_size_.width()), | |
| 560 static_cast<float>(large_size_.height()), 0) | |
| 561 .Length() / | |
| 562 2.0f); | |
| 563 | |
| 564 // Calculate the ratio of how far the transformed circle's top most point is | |
|
varkha
2015/10/22 18:33:08
nit: topmost.
bruthig
2015/11/04 21:51:02
Done.
| |
| 565 // from the destination compared to how far it can be. | |
| 566 const float top_point_distance_estimate = fabs( | |
|
varkha
2015/10/22 18:33:08
When is the argument of fabs ever negative?
bruthig
2015/11/04 21:51:02
circle_top_point.y() is expected to be negative si
| |
| 567 circle_top_point.y() / static_cast<float>(large_size_.height()) / 2.0f); | |
|
varkha
2015/10/22 18:33:07
Are the brackets correct here? Is it not y/(h/2) s
bruthig
2015/11/04 21:51:02
Done.
| |
| 568 | |
| 569 return std::min(center_point_distance_estimate, top_point_distance_estimate); | |
| 570 } | |
| 571 | |
| 407 void InkDropAnimation::AnimationStartedCallback( | 572 void InkDropAnimation::AnimationStartedCallback( |
| 408 InkDropState ink_drop_state, | 573 InkDropState ink_drop_state, |
| 409 const ui::CallbackLayerAnimationObserver& observer) { | 574 const ui::CallbackLayerAnimationObserver& observer) { |
| 410 FOR_EACH_OBSERVER(InkDropAnimationObserver, observers_, | 575 FOR_EACH_OBSERVER(InkDropAnimationObserver, observers_, |
| 411 InkDropAnimationStarted(ink_drop_state)); | 576 InkDropAnimationStarted(ink_drop_state)); |
| 412 } | 577 } |
| 413 | 578 |
| 414 bool InkDropAnimation::AnimationEndedCallback( | 579 bool InkDropAnimation::AnimationEndedCallback( |
| 415 InkDropState ink_drop_state, | 580 InkDropState ink_drop_state, |
| 416 const ui::CallbackLayerAnimationObserver& observer) { | 581 const ui::CallbackLayerAnimationObserver& observer) { |
| 417 FOR_EACH_OBSERVER( | 582 FOR_EACH_OBSERVER( |
| 418 InkDropAnimationObserver, observers_, | 583 InkDropAnimationObserver, observers_, |
| 419 InkDropAnimationEnded(ink_drop_state, | 584 InkDropAnimationEnded(ink_drop_state, |
| 420 observer.aborted_count() | 585 observer.aborted_count() |
| 421 ? InkDropAnimationObserver::PRE_EMPTED | 586 ? InkDropAnimationObserver::PRE_EMPTED |
| 422 : InkDropAnimationObserver::SUCCESS)); | 587 : InkDropAnimationObserver::SUCCESS)); |
| 423 return true; | 588 return true; |
| 424 } | 589 } |
| 425 | 590 |
| 426 } // namespace views | 591 } // namespace views |
| OLD | NEW |