Index: ui/views/animation/ink_drop_hover.cc |
diff --git a/ui/views/animation/ink_drop_hover.cc b/ui/views/animation/ink_drop_hover.cc |
index be440c95b9d4b701e1180204a265b6059c4b1b1c..9bb7b02d8958015a3eedd6acc34b943d79d8d1ae 100644 |
--- a/ui/views/animation/ink_drop_hover.cc |
+++ b/ui/views/animation/ink_drop_hover.cc |
@@ -27,7 +27,10 @@ InkDropHover::InkDropHover(const gfx::Size& size, |
int corner_radius, |
const gfx::Point& center_point, |
SkColor color) |
- : last_animation_initiated_was_fade_in_(false), |
+ : size_(size), |
+ explode_size_(size), |
+ center_point_(center_point), |
+ last_animation_initiated_was_fade_in_(false), |
layer_delegate_( |
new RoundedRectangleLayerDelegate(color, size, corner_radius)), |
layer_(new ui::Layer()) { |
@@ -38,11 +41,6 @@ InkDropHover::InkDropHover(const gfx::Size& size, |
layer_->SetOpacity(kHoverVisibleOpacity); |
layer_->SetMasksToBounds(false); |
layer_->set_name("InkDropHover:layer"); |
- |
- gfx::Transform transform; |
- transform.Translate(center_point.x() - layer_->bounds().CenterPoint().x(), |
- center_point.y() - layer_->bounds().CenterPoint().y()); |
- layer_->SetTransform(transform); |
} |
InkDropHover::~InkDropHover() {} |
@@ -54,17 +52,21 @@ bool InkDropHover::IsFadingInOrVisible() const { |
void InkDropHover::FadeIn(const base::TimeDelta& duration) { |
layer_->SetOpacity(kHiddenOpacity); |
layer_->SetVisible(true); |
- AnimateFade(FADE_IN, duration); |
+ AnimateFade(FADE_IN, duration, size_, size_); |
} |
-void InkDropHover::FadeOut(const base::TimeDelta& duration) { |
- AnimateFade(FADE_OUT, duration); |
+void InkDropHover::FadeOut(const base::TimeDelta& duration, bool explode) { |
+ AnimateFade(FADE_OUT, duration, size_, explode ? explode_size_ : size_); |
} |
void InkDropHover::AnimateFade(HoverAnimationType animation_type, |
- const base::TimeDelta& duration) { |
+ const base::TimeDelta& duration, |
+ const gfx::Size& initial_size, |
+ const gfx::Size& target_size) { |
last_animation_initiated_was_fade_in_ = animation_type == FADE_IN; |
+ layer_->SetTransform(CalculateTransform(initial_size)); |
+ |
// The |animation_observer| will be destroyed when the |
// AnimationStartedCallback() returns true. |
ui::CallbackLayerAnimationObserver* animation_observer = |
@@ -77,19 +79,38 @@ void InkDropHover::AnimateFade(HoverAnimationType animation_type, |
animation.SetTweenType(gfx::Tween::EASE_IN_OUT); |
animation.SetPreemptionStrategy( |
ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
- ui::LayerAnimationElement* animation_element = |
+ |
+ ui::LayerAnimationElement* opacity_element = |
ui::LayerAnimationElement::CreateOpacityElement( |
animation_type == FADE_IN ? kHoverVisibleOpacity : kHiddenOpacity, |
duration); |
- ui::LayerAnimationSequence* animation_sequence = |
- new ui::LayerAnimationSequence(animation_element); |
- animation_sequence->AddObserver(animation_observer); |
- |
- animator->StartAnimation(animation_sequence); |
+ ui::LayerAnimationSequence* opacity_sequence = |
+ new ui::LayerAnimationSequence(opacity_element); |
+ opacity_sequence->AddObserver(animation_observer); |
+ animator->StartAnimation(opacity_sequence); |
+ |
+ if (initial_size != target_size) { |
+ ui::LayerAnimationElement* transform_element = |
+ ui::LayerAnimationElement::CreateTransformElement( |
+ CalculateTransform(target_size), duration); |
+ ui::LayerAnimationSequence* transform_sequence = |
+ new ui::LayerAnimationSequence(transform_element); |
+ transform_sequence->AddObserver(animation_observer); |
+ animator->StartAnimation(transform_sequence); |
+ } |
animation_observer->SetActive(); |
} |
+gfx::Transform InkDropHover::CalculateTransform(const gfx::Size& size) const { |
+ gfx::Transform transform; |
+ transform.Translate(center_point_.x(), center_point_.y()); |
+ transform.Scale(size.width() / size_.width(), size.height() / size_.height()); |
+ transform.Translate(-layer_delegate_->GetCenterPoint().x(), |
+ -layer_delegate_->GetCenterPoint().y()); |
+ return transform; |
+} |
+ |
bool InkDropHover::AnimationEndedCallback( |
HoverAnimationType animation_type, |
const ui::CallbackLayerAnimationObserver& observer) { |