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

Unified Diff: ash/common/wm/overview/window_selector_item.cc

Issue 2239233002: [ash-md] Fades overview header in and out (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: [ash-md] Fades overview header in and out (rebase) Created 4 years, 3 months 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 side-by-side diff with in-line comments
Download patch
Index: ash/common/wm/overview/window_selector_item.cc
diff --git a/ash/common/wm/overview/window_selector_item.cc b/ash/common/wm/overview/window_selector_item.cc
index 91d08e97c7bf56069619e81a3fe30c6f596d2c6e..e26f72de5cb43479a95f269672983843b6e649c3 100644
--- a/ash/common/wm/overview/window_selector_item.cc
+++ b/ash/common/wm/overview/window_selector_item.cc
@@ -10,6 +10,7 @@
#include "ash/common/material_design/material_design_controller.h"
#include "ash/common/metrics/user_metrics_action.h"
#include "ash/common/shell_window_ids.h"
+#include "ash/common/wm/overview/cleanup_animation_observer.h"
#include "ash/common/wm/overview/overview_animation_type.h"
#include "ash/common/wm/overview/scoped_overview_animation_settings.h"
#include "ash/common/wm/overview/scoped_overview_animation_settings_factory.h"
@@ -30,7 +31,9 @@
#include "grit/ash_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer_animation_sequence.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/color_utils.h"
#include "ui/gfx/geometry/safe_integer_conversions.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/paint_vector_icon.h"
@@ -97,6 +100,13 @@ static const float kDimmedItemOpacity = 0.5f;
// Opacity for fading out during closing a window.
static const float kClosingItemOpacity = 0.8f;
+// Opacity for the item header.
+static const float kHeaderOpacity =
+ (SkColorGetA(kLabelBackgroundColor) / 255.f);
+
+// The time duration for fade out animations when exiting overview mode.
+static const int kTransitionMilliseconds = 300;
+
// Duration of background opacity transition for the selected label.
static const int kSelectorFadeInMilliseconds = 350;
@@ -156,43 +166,124 @@ OverviewCloseButton::OverviewCloseButton(views::ButtonListener* listener)
OverviewCloseButton::~OverviewCloseButton() {}
+} // namespace
+
// A View having rounded corners and a specified background color which is
// only painted within the bounds defined by the rounded corners.
// TODO(varkha): This duplicates code from RoundedImageView. Refactor these
// classes and move into ui/views.
-class RoundedContainerView : public views::View {
+class WindowSelectorItem::RoundedContainerView
+ : public views::View,
+ public gfx::AnimationDelegate,
+ public ui::LayerAnimationObserver {
public:
- RoundedContainerView(int corner_radius, SkColor background)
- : corner_radius_(corner_radius), background_(background) {}
+ RoundedContainerView(WindowSelectorItem* item,
+ int corner_radius,
+ SkColor background)
+ : item_(item),
+ corner_radius_(corner_radius),
+ previous_color_(background),
+ color_(background),
+ last_alpha_(0),
+ current_value_(0),
+ layer_(nullptr),
+ animation_(new gfx::SlideAnimation(this)) {}
~RoundedContainerView() override {}
+ void OnItemRestored() { item_ = nullptr; }
+
+ void ObserveLayer(ui::Layer* layer) {
+ layer_ = layer;
+ layer_->GetAnimator()->AddObserver(this);
+ }
+
+ void set_color(SkColor color) { color_ = color; }
+
+ void SetBackgroundOpacity(float opacity) {
bruthig 2016/09/02 16:00:12 nit: IMO this would be better named as AnimateBack
varkha 2016/09/08 00:09:50 Done.
+ animation_->SetSlideDuration(kSelectorFadeInMilliseconds);
+ animation_->Reset(0);
+ animation_->Show();
+ color_ = SkColorSetA(color_, opacity * 255);
+ }
+
void OnPaint(gfx::Canvas* canvas) override {
views::View::OnPaint(canvas);
-
SkScalar radius = SkIntToScalar(corner_radius_);
- const SkScalar kRadius[8] = {radius, radius, radius, radius,
- radius, radius, radius, radius};
+ const SkScalar kRadius[8] = {radius, radius, radius, radius, 0, 0, 0, 0};
SkPath path;
gfx::Rect bounds(size());
- bounds.set_height(bounds.height() + radius);
path.addRoundRect(gfx::RectToSkRect(bounds), kRadius);
SkPaint paint;
paint.setAntiAlias(true);
canvas->ClipPath(path, true);
- canvas->DrawColor(background_);
+
+ SkColor color = previous_color_;
+ if (color_ != color)
+ color = color_utils::AlphaBlend(color_, previous_color_, current_value_);
+ canvas->DrawColor(color);
+ last_alpha_ = SkColorGetA(color);
}
private:
+ // gfx::AnimationDelegate:
+ void AnimationEnded(const gfx::Animation* animation) override {
+ previous_color_ = color_;
+ }
+
+ void AnimationProgressed(const gfx::Animation* animation) override {
+ current_value_ = animation_->CurrentValueBetween(0, 255);
+ SchedulePaintInRect(GetLocalBounds());
+ }
+
+ void AnimationCanceled(const gfx::Animation* animation) override {
+ previous_color_ = color_;
+ current_value_ = 255;
+ SchedulePaintInRect(GetLocalBounds());
+ }
+
+ // ui::LayerAnimationObserver:
+ void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override {
+ if (0 != (sequence->properties() &
+ ui::LayerAnimationElement::AnimatableProperty::OPACITY)) {
+ if (item_)
+ item_->HideHeaderAndSetShape(0);
+ if (layer_) {
+ layer_->GetAnimator()->RemoveObserver(this);
+ layer_ = nullptr;
+ }
+ animation_->SetSlideDuration(400);
bruthig 2016/09/02 16:00:12 nit: Can the 400 be made a named constant like kSe
varkha 2016/09/02 21:38:37 Done.
+ animation_->Reset(0);
+ animation_->Show();
+ }
+ }
+
+ void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) override {
+ if (0 != (sequence->properties() &
+ ui::LayerAnimationElement::AnimatableProperty::OPACITY)) {
+ if (layer_) {
+ layer_->GetAnimator()->RemoveObserver(this);
+ layer_ = nullptr;
+ }
+ }
+ }
+
+ void OnLayerAnimationScheduled(
+ ui::LayerAnimationSequence* sequence) override {}
+
+ WindowSelectorItem* item_;
int corner_radius_;
- SkColor background_;
+ SkColor previous_color_;
+ SkColor color_;
+ int last_alpha_;
+ int current_value_;
+ ui::Layer* layer_;
+ std::unique_ptr<gfx::SlideAnimation> animation_;
bruthig 2016/09/02 16:00:12 Is a SlideAnimation required or would a LinearAnim
varkha 2016/09/08 00:09:50 SlideAnimation saves from some of the headaches li
DISALLOW_COPY_AND_ASSIGN(RoundedContainerView);
};
-} // namespace
-
bool WindowSelectorItem::use_mask_ = false;
bool WindowSelectorItem::use_shape_ = false;
@@ -223,8 +314,10 @@ gfx::Rect WindowSelectorItem::OverviewLabelButton::GetChildAreaBounds() {
class WindowSelectorItem::CaptionContainerView : public views::View {
public:
CaptionContainerView(WindowSelectorItem::OverviewLabelButton* label,
- views::ImageButton* close_button)
- : label_(label), close_button_(close_button) {
+ views::ImageButton* close_button,
+ WindowSelectorItem::RoundedContainerView* background)
+ : label_(label), close_button_(close_button), background_(background) {
+ AddChildView(background_);
AddChildView(label_);
AddChildView(close_button_);
}
@@ -239,6 +332,13 @@ class WindowSelectorItem::CaptionContainerView : public views::View {
// events from reaching the transformed window in overview.
gfx::Rect bounds(GetLocalBounds());
bounds.Inset(kWindowSelectorMargin, kWindowSelectorMargin);
+ gfx::Rect background_bounds(bounds);
+ background_bounds.set_height(close_button_->GetPreferredSize().height());
+ background_bounds.set_y(background_bounds.y() +
+ close_button_->GetPreferredSize().height() -
+ background_bounds.height());
+ background_->SetBoundsRect(background_bounds);
+
const int visible_height = close_button_->GetPreferredSize().height();
gfx::Insets label_padding(0, 0, bounds.height() - visible_height,
visible_height);
@@ -250,11 +350,10 @@ class WindowSelectorItem::CaptionContainerView : public views::View {
close_button_->SetBoundsRect(bounds);
}
- void OnBoundsChanged(const gfx::Rect& previous_bounds) override { Layout(); }
-
private:
WindowSelectorItem::OverviewLabelButton* label_;
views::ImageButton* close_button_;
+ WindowSelectorItem::RoundedContainerView* background_;
DISALLOW_COPY_AND_ASSIGN(CaptionContainerView);
};
@@ -265,10 +364,13 @@ WindowSelectorItem::WindowSelectorItem(WmWindow* window,
root_window_(window->GetRootWindow()),
transform_window_(window),
in_bounds_update_(false),
+ selected_(false),
+ first_time_update_(true),
caption_container_view_(nullptr),
window_label_button_view_(nullptr),
close_button_(new OverviewCloseButton(this)),
- window_selector_(window_selector) {
+ window_selector_(window_selector),
+ background_view_(nullptr) {
CreateWindowLabel(window->GetTitle());
if (!ash::MaterialDesignController::IsOverviewMaterial()) {
views::Widget::InitParams params;
@@ -300,6 +402,8 @@ WindowSelectorItem::WindowSelectorItem(WmWindow* window,
}
WindowSelectorItem::~WindowSelectorItem() {
+ if (background_view_)
+ background_view_->OnItemRestored();
GetWindow()->RemoveObserver(this);
}
@@ -309,6 +413,11 @@ WmWindow* WindowSelectorItem::GetWindow() {
void WindowSelectorItem::RestoreWindow() {
transform_window_.RestoreWindow();
+ if (background_view_)
+ background_view_->OnItemRestored();
+ UpdateHeaderLayout(
+ OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS);
+ FadeOut(std::move(window_label_));
}
void WindowSelectorItem::ShowWindowOnExit() {
@@ -347,28 +456,21 @@ void WindowSelectorItem::SetBounds(const gfx::Rect& target_bounds,
void WindowSelectorItem::SetSelected(bool selected) {
if (!ash::MaterialDesignController::IsOverviewMaterial())
return;
- WmWindow* window =
- WmLookup::Get()->GetWindowForWidget(window_label_selector_.get());
- ui::ScopedLayerAnimationSettings animation_settings(
- window->GetLayer()->GetAnimator());
- animation_settings.SetTransitionDuration(
- base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds));
- animation_settings.SetTweenType(selected ? gfx::Tween::FAST_OUT_LINEAR_IN
- : gfx::Tween::LINEAR_OUT_SLOW_IN);
- animation_settings.SetPreemptionStrategy(
- ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
- window->SetOpacity(selected ? 0.0f : 1.0f);
-
- ui::ScopedLayerAnimationSettings animation_settings_shadow(
- shadow_->shadow_layer()->GetAnimator());
- animation_settings_shadow.SetTransitionDuration(
- base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds));
- animation_settings_shadow.SetTweenType(selected
- ? gfx::Tween::FAST_OUT_LINEAR_IN
- : gfx::Tween::LINEAR_OUT_SLOW_IN);
- animation_settings_shadow.SetPreemptionStrategy(
- ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
- shadow_->shadow_layer()->SetOpacity(selected ? 0.0f : 1.0f);
+ selected_ = selected;
+ background_view_->SetBackgroundOpacity(selected ? 0.0f : kHeaderOpacity);
+
+ if (shadow_) {
+ ui::ScopedLayerAnimationSettings animation_settings_shadow(
+ shadow_->shadow_layer()->GetAnimator());
+ animation_settings_shadow.SetTransitionDuration(
+ base::TimeDelta::FromMilliseconds(kSelectorFadeInMilliseconds));
+ animation_settings_shadow.SetTweenType(
+ selected ? gfx::Tween::FAST_OUT_LINEAR_IN
+ : gfx::Tween::LINEAR_OUT_SLOW_IN);
+ animation_settings_shadow.SetPreemptionStrategy(
+ ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
+ shadow_->shadow_layer()->SetOpacity(selected ? 0.0f : 1.0f);
+ }
}
void WindowSelectorItem::RecomputeWindowTransforms() {
@@ -409,6 +511,10 @@ void WindowSelectorItem::CloseWindow() {
transform_window_.Close();
}
+void WindowSelectorItem::HideHeaderAndSetShape(int radius) {
+ transform_window_.HideHeaderAndSetShape(use_mask_, use_shape_, radius);
bruthig 2016/09/02 16:00:12 [Discussed offline] Since HideHeaderAndSetShape()
varkha 2016/09/08 00:09:50 Agreed. I will be posting removal of those command
+}
+
void WindowSelectorItem::SetDimmed(bool dimmed) {
dimmed_ = dimmed;
SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f);
@@ -473,17 +579,17 @@ void WindowSelectorItem::SetItemBounds(const gfx::Rect& target_bounds,
screen_rect, selector_item_bounds);
ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings;
transform_window_.BeginScopedAnimation(animation_type, &animation_settings);
- // Rounded corners are achieved by using a mask layer on the original window
- // before the transform. Dividing by scale factor obtains the corner radius
- // which when scaled will yield |kLabelBackgroundRadius|.
- transform_window_.SetTransform(
- root_window_, transform, use_mask_, use_shape_,
- (kLabelBackgroundRadius / GetItemScale(target_bounds.size())));
+ transform_window_.SetTransform(root_window_, transform, use_mask_);
transform_window_.set_overview_transform(transform);
}
void WindowSelectorItem::SetOpacity(float opacity) {
window_label_->SetOpacity(opacity);
+ if (background_view_) {
+ background_view_->SetBackgroundOpacity(selected_ ? 0.f : kHeaderOpacity *
+ opacity);
+ }
+
if (!ash::MaterialDesignController::IsOverviewMaterial())
close_button_widget_->SetOpacity(opacity);
@@ -514,23 +620,38 @@ void WindowSelectorItem::UpdateWindowLabel(
void WindowSelectorItem::CreateWindowLabel(const base::string16& title) {
const bool material = ash::MaterialDesignController::IsOverviewMaterial();
- window_label_.reset(new views::Widget);
- views::Widget::InitParams params;
- params.type = views::Widget::InitParams::TYPE_POPUP;
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
- params.visible_on_all_workspaces = true;
- params.name = "OverviewModeLabel";
- window_label_->set_focus_on_creation(false);
+
+ if (material) {
+ background_view_ = new RoundedContainerView(
bruthig 2016/09/02 16:00:12 nit: It would be helpful to have a comment about w
varkha 2016/09/08 00:09:50 Done.
+ this, kLabelBackgroundRadius, transform_window_.GetTopColor());
+ }
+
+ views::Widget::InitParams params_label;
+ params_label.type = views::Widget::InitParams::TYPE_POPUP;
+ params_label.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params_label.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
+ params_label.visible_on_all_workspaces = true;
+ params_label.name = "OverviewModeLabel";
+ params_label.activatable =
+ views::Widget::InitParams::Activatable::ACTIVATABLE_DEFAULT;
+ params_label.accept_events = true;
root_window_->GetRootWindowController()
->ConfigureWidgetInitParamsForContainer(
- window_label_.get(), kShellWindowId_StatusContainer, &params);
- window_label_->Init(params);
+ window_label_.get(),
+ transform_window_.window()->GetParent()->GetShellWindowId(),
+ &params_label);
+ window_label_.reset(new views::Widget);
+ window_label_->set_focus_on_creation(false);
+ window_label_->Init(params_label);
window_label_button_view_ = new OverviewLabelButton(this, title);
window_label_button_view_->SetBorder(views::Border::NullBorder());
window_label_button_view_->SetEnabledTextColors(kLabelColor);
window_label_button_view_->set_animate_on_state_change(false);
if (material) {
+ WmWindow* label_window =
+ WmLookup::Get()->GetWindowForWidget(window_label_.get());
+ label_window->GetParent()->StackChildAbove(label_window,
+ transform_window_.window());
window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
} else {
window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
@@ -545,10 +666,11 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) {
// Hint at the background color that the label will be drawn onto (for
// subpixel antialiasing). Does not actually set the background color.
window_label_button_view_->SetBackgroundColorHint(kLabelBackgroundColor);
- caption_container_view_ =
- new CaptionContainerView(window_label_button_view_, close_button_);
+ caption_container_view_ = new CaptionContainerView(
+ window_label_button_view_, close_button_, background_view_);
window_label_->SetContentsView(caption_container_view_);
window_label_button_view_->SetVisible(false);
+ window_label_->SetOpacity(0);
window_label_->Show();
shadow_.reset(new ::wm::Shadow());
@@ -556,23 +678,14 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) {
shadow_->layer()->SetVisible(true);
window_label_->GetLayer()->Add(shadow_->layer());
window_label_->GetLayer()->SetMasksToBounds(false);
-
- views::View* background_view =
- new RoundedContainerView(kLabelBackgroundRadius, kLabelBackgroundColor);
- window_label_selector_.reset(new views::Widget);
- params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO;
- params.accept_events = false;
- params.name = "OverviewModeLabelSelector";
- window_label_selector_->Init(params);
- window_label_selector_->set_focus_on_creation(false);
- window_label_selector_->SetContentsView(background_view);
- window_label_selector_->Show();
+ UpdateHeaderLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
} else {
// Indicate that the label will be drawn onto a transparent background
// (disables subpixel antialiasing).
window_label_button_view_->SetBackgroundColorHint(SK_ColorTRANSPARENT);
window_label_->SetContentsView(window_label_button_view_);
}
+ first_time_update_ = false;
}
void WindowSelectorItem::UpdateHeaderLayout(
@@ -582,44 +695,43 @@ void WindowSelectorItem::UpdateHeaderLayout(
if (ash::MaterialDesignController::IsOverviewMaterial()) {
gfx::Rect label_rect(close_button_->GetPreferredSize());
- label_rect.set_y(-label_rect.height());
label_rect.set_width(transformed_window_bounds.width());
-
+ // For tabbed windows the initial bounds of the caption are set such that it
+ // appears to be "growing" up from the window content area.
+ label_rect.set_y(first_time_update_ ? -transform_window_.GetTopInset()
+ : -label_rect.height());
if (!window_label_button_view_->visible()) {
window_label_button_view_->SetVisible(true);
bruthig 2016/09/02 16:00:12 Am I correct that this SetVisible() call invokes a
varkha 2016/09/08 00:09:50 I don't think so. |window_label_button_view_| is j
bruthig 2016/09/08 18:32:49 Acknowledged.
+ if (background_view_) {
+ background_view_->ObserveLayer(window_label_->GetLayer());
+ background_view_->set_color(kLabelBackgroundColor);
+ }
SetupFadeInAfterLayout(window_label_.get());
- SetupFadeInAfterLayout(window_label_selector_.get());
}
WmWindow* window_label_window =
WmLookup::Get()->GetWindowForWidget(window_label_.get());
- WmWindow* window_label_selector_window =
- WmLookup::Get()->GetWindowForWidget(window_label_selector_.get());
std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings =
ScopedOverviewAnimationSettingsFactory::Get()
->CreateOverviewAnimationSettings(animation_type,
window_label_window);
- std::unique_ptr<ScopedOverviewAnimationSettings>
- animation_settings_selector =
- ScopedOverviewAnimationSettingsFactory::Get()
- ->CreateOverviewAnimationSettings(animation_type,
- window_label_selector_window);
- window_label_selector_window->SetBounds(label_rect);
// |window_label_window| covers both the transformed window and the header
// as well as the gap between the windows to prevent events from reaching
// the window including its sizing borders.
- label_rect.set_height(label_rect.height() +
- transformed_window_bounds.height());
- gfx::Rect shadow_bounds(label_rect.size());
+ if (!first_time_update_) {
+ label_rect.set_height(close_button_->GetPreferredSize().height() +
+ transformed_window_bounds.height());
+ }
label_rect.Inset(-kWindowSelectorMargin, -kWindowSelectorMargin);
window_label_window->SetBounds(label_rect);
gfx::Transform label_transform;
label_transform.Translate(transformed_window_bounds.x(),
transformed_window_bounds.y());
window_label_window->SetTransform(label_transform);
- window_label_selector_window->SetTransform(label_transform);
- shadow_bounds.Offset(kWindowSelectorMargin, kWindowSelectorMargin);
- shadow_->SetContentBounds(shadow_bounds);
+ gfx::Rect shadow_bounds(label_rect.size());
+ shadow_bounds.Inset(kWindowSelectorMargin, kWindowSelectorMargin);
+ if (shadow_)
+ shadow_->SetContentBounds(shadow_bounds);
} else {
if (!close_button_->visible()) {
close_button_->SetVisible(true);
@@ -647,21 +759,14 @@ void WindowSelectorItem::AnimateOpacity(float opacity,
transform_window_.BeginScopedAnimation(animation_type, &animation_settings);
transform_window_.SetOpacity(opacity);
+ const float header_opacity = selected_ ? 0.f : kHeaderOpacity * opacity;
WmWindow* window_label_window =
WmLookup::Get()->GetWindowForWidget(window_label_.get());
std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_label =
ScopedOverviewAnimationSettingsFactory::Get()
->CreateOverviewAnimationSettings(animation_type,
window_label_window);
- window_label_window->SetOpacity(opacity);
-
- WmWindow* window_label_selector_window =
- WmLookup::Get()->GetWindowForWidget(window_label_selector_.get());
- std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings_selector =
- ScopedOverviewAnimationSettingsFactory::Get()
- ->CreateOverviewAnimationSettings(animation_type,
- window_label_selector_window);
- window_label_selector_window->SetOpacity(opacity);
+ window_label_window->SetOpacity(header_opacity);
}
void WindowSelectorItem::UpdateCloseButtonAccessibilityName() {
@@ -670,4 +775,34 @@ void WindowSelectorItem::UpdateCloseButtonAccessibilityName() {
GetWindow()->GetTitle()));
}
+void WindowSelectorItem::FadeOut(std::unique_ptr<views::Widget> widget) {
+ widget->SetOpacity(1.f);
+
+ // Fade out the widget. This animation continues past the lifetime of |this|.
+ // TODO(varkha): Add a new OverviewAnimationType for this.
+ WmWindow* widget_window = WmLookup::Get()->GetWindowForWidget(widget.get());
+ widget_window->GetLayer()->GetAnimator()->SchedulePauseForProperties(
+ base::TimeDelta::FromMilliseconds(kTransitionMilliseconds / 4),
+ ui::LayerAnimationElement::OPACITY);
+ ui::ScopedLayerAnimationSettings animation_settings(
+ widget_window->GetLayer()->GetAnimator());
+ animation_settings.SetTransitionDuration(
+ base::TimeDelta::FromMilliseconds(kTransitionMilliseconds / 4 * 3));
+ animation_settings.SetTweenType(gfx::Tween::EASE_OUT);
+ animation_settings.SetPreemptionStrategy(
+ ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
+ // CleanupAnimationObserver will delete itself (and the widget) when the
+ // opacity animation is complete.
+ // Ownership over the observer is passed to the window_selector_->delegate()
+ // which has longer lifetime so that animations can continue even after the
+ // overview mode is shut down.
+ views::Widget* widget_ptr = widget.get();
+ std::unique_ptr<CleanupAnimationObserver> observer(
+ new CleanupAnimationObserver(std::move(widget)));
+ animation_settings.AddObserver(observer.get());
+ window_selector_->delegate()->AddDelayedAnimationObserver(
+ std::move(observer));
+ widget_ptr->SetOpacity(0.f);
+}
+
} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698