Index: ash/system/tray/tray_background_view.cc |
diff --git a/ash/system/tray/tray_background_view.cc b/ash/system/tray/tray_background_view.cc |
index fc24c14932af7c4673e9a46c1d195ce8701d965a..151afd226f910f701466129b71faf7e84e711e57 100644 |
--- a/ash/system/tray/tray_background_view.cc |
+++ b/ash/system/tray/tray_background_view.cc |
@@ -22,12 +22,17 @@ |
#include "ui/aura/window.h" |
#include "ui/aura/window_event_dispatcher.h" |
#include "ui/base/resource/resource_bundle.h" |
+#include "ui/compositor/layer.h" |
+#include "ui/compositor/layer_animation_element.h" |
+#include "ui/compositor/scoped_layer_animation_settings.h" |
+#include "ui/gfx/animation/tween.h" |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/image/image_skia.h" |
#include "ui/gfx/image/image_skia_operations.h" |
#include "ui/gfx/rect.h" |
#include "ui/gfx/screen.h" |
#include "ui/gfx/skia_util.h" |
+#include "ui/gfx/transform.h" |
#include "ui/views/background.h" |
#include "ui/views/layout/box_layout.h" |
@@ -39,6 +44,15 @@ const SkColor kTrayBackgroundPressedColor = SkColorSetRGB(66, 129, 244); |
const int kAnimationDurationForPopupMS = 200; |
+// Animation constant based on visual design. During of opacity animation |
flackr
2014/05/08 17:09:49
Did you mean duration of opacity ...?
nit: "Anima
jonross
2014/05/08 17:24:25
Done.
|
+// for visibility changes. |
+const int kAnimationDurationForVisibility = 250; |
flackr
2014/05/08 17:09:49
nit: This should have units in the name, i.e. kAni
jonross
2014/05/08 17:24:25
Done.
|
+ |
+// Animation constant based on visual design. When becoming visible delay |
+// the animation so that StatusAreaWidgetDelegate can animate sibling views |
+// out of the position to be occuped by the TrayBackgroundView. |
+const int kShowAnimationDelay = 100; |
flackr
2014/05/08 17:09:49
Ditto.
jonross
2014/05/08 17:24:25
Done.
|
+ |
} // namespace |
using views::TrayBubbleView; |
@@ -307,6 +321,9 @@ TrayBackgroundView::TrayBackgroundView(StatusAreaWidget* status_area_widget) |
tray_container_ = new TrayContainer(shelf_alignment_); |
SetContents(tray_container_); |
tray_event_filter_.reset(new TrayEventFilter); |
+ |
+ SetPaintToLayer(true); |
+ SetFillsBoundsOpaquely(false); |
} |
TrayBackgroundView::~TrayBackgroundView() { |
@@ -319,6 +336,51 @@ void TrayBackgroundView::Initialize() { |
SetTrayBorder(); |
} |
+void TrayBackgroundView::SetVisible(bool visible) { |
+ if (visible == this->visible()) |
+ return; |
+ |
+ if (visible) { |
+ // A translation transform was applied when becoming hidden. However the |
+ // alignment of the shelf can change. Reset the offscreen transform so that |
+ // the animation to becoming visible reflects the changed layout. |
+ HideTransformation(); |
+ // SetVisible(false) is defered until the animation for hiding is done. |
+ // Otherwise the view is immediately hidden and the animation does not |
+ // render. |
+ views::View::SetVisible(visible); |
+ } |
+ |
+ layer()->GetAnimator()->StopAnimating(); |
+ ui::ScopedLayerAnimationSettings animation(layer()->GetAnimator()); |
+ animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds( |
+ kAnimationDurationForVisibility)); |
+ animation.SetPreemptionStrategy( |
+ ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
+ |
+ if (visible) { |
+ animation.SetTweenType(gfx::Tween::EASE_OUT); |
+ // Show is delayed so as to allow time for other children of |
+ // StatusAreaWidget to begin animating to their new positions. |
+ layer()->GetAnimator()->SchedulePauseForProperties( |
+ base::TimeDelta::FromMilliseconds(kShowAnimationDelay), |
+ ui::LayerAnimationElement::OPACITY | |
+ ui::LayerAnimationElement::TRANSFORM); |
+ layer()->SetOpacity(1.0f); |
+ gfx::Transform transform; |
+ transform.Translate(0.0f, 0.0f); |
+ layer()->SetTransform(transform); |
+ } else { |
+ // Listen only to the hide animation. As we cannot turn off visibility |
+ // until the animation is over. |
+ animation.AddObserver(this); |
+ animation.SetTweenType(gfx::Tween::EASE_IN); |
+ layer()->SetOpacity(0.0f); |
+ layer()->SetVisible(false); |
+ HideTransformation(); |
+ } |
+} |
+ |
const char* TrayBackgroundView::GetClassName() const { |
return kViewClassName; |
} |
@@ -420,6 +482,20 @@ void TrayBackgroundView::SetTrayBorder() { |
top_edge, left_edge, bottom_edge, right_edge)); |
} |
+void TrayBackgroundView::OnImplicitAnimationsCompleted() { |
+ views::View::SetVisible(false); |
+} |
+ |
+void TrayBackgroundView::HideTransformation() { |
+ gfx::Transform transform; |
+ if (shelf_alignment_ == SHELF_ALIGNMENT_BOTTOM || |
+ shelf_alignment_ == SHELF_ALIGNMENT_TOP) |
+ transform.Translate(width(), 0.0f); |
+ else |
+ transform.Translate(0.0f, height()); |
+ layer()->SetTransform(transform); |
+} |
+ |
void TrayBackgroundView::InitializeBubbleAnimations( |
views::Widget* bubble_widget) { |
wm::SetWindowVisibilityAnimationType( |