Chromium Code Reviews| Index: cc/input/scrollbar_animation_controller.cc |
| diff --git a/cc/input/scrollbar_animation_controller.cc b/cc/input/scrollbar_animation_controller.cc |
| index c018016c8d7f93be8c052b088abf5e6fef919cfd..cc4693a1ef01d8d4a50cf3bd78891d1ab20c2a17 100644 |
| --- a/cc/input/scrollbar_animation_controller.cc |
| +++ b/cc/input/scrollbar_animation_controller.cc |
| @@ -27,14 +27,16 @@ std::unique_ptr<ScrollbarAnimationController> |
| ScrollbarAnimationController::CreateScrollbarAnimationControllerAuraOverlay( |
| int scroll_layer_id, |
| ScrollbarAnimationControllerClient* client, |
| - base::TimeDelta show_delay, |
| + base::TimeDelta fade_in_delay, |
| base::TimeDelta fade_out_delay, |
| base::TimeDelta fade_out_resize_delay, |
| + base::TimeDelta fade_in_duration, |
| base::TimeDelta fade_out_duration, |
| base::TimeDelta thinning_duration) { |
| return base::WrapUnique(new ScrollbarAnimationController( |
| - scroll_layer_id, client, show_delay, fade_out_delay, |
| - fade_out_resize_delay, fade_out_duration, thinning_duration)); |
| + scroll_layer_id, client, fade_in_delay, fade_out_delay, |
| + fade_out_resize_delay, fade_in_duration, fade_out_duration, |
| + thinning_duration)); |
| } |
| ScrollbarAnimationController::ScrollbarAnimationController( |
| @@ -46,13 +48,14 @@ ScrollbarAnimationController::ScrollbarAnimationController( |
| : client_(client), |
| fade_out_delay_(fade_out_delay), |
| fade_out_resize_delay_(fade_out_resize_delay), |
| + fade_out_duration_(fade_out_duration), |
| need_trigger_scrollbar_show_(false), |
| is_animating_(false), |
| + animation_change_(NONE), |
| scroll_layer_id_(scroll_layer_id), |
| currently_scrolling_(false), |
| show_in_fast_scroll_(false), |
| opacity_(0.0f), |
| - fade_out_duration_(fade_out_duration), |
| show_scrollbars_on_scroll_gesture_(false), |
| need_thinning_animation_(false), |
| weak_factory_(this) { |
| @@ -62,22 +65,25 @@ ScrollbarAnimationController::ScrollbarAnimationController( |
| ScrollbarAnimationController::ScrollbarAnimationController( |
| int scroll_layer_id, |
| ScrollbarAnimationControllerClient* client, |
| - base::TimeDelta show_delay, |
| + base::TimeDelta fade_in_delay, |
| base::TimeDelta fade_out_delay, |
| base::TimeDelta fade_out_resize_delay, |
| + base::TimeDelta fade_in_duration, |
| base::TimeDelta fade_out_duration, |
| base::TimeDelta thinning_duration) |
| : client_(client), |
| - show_delay_(show_delay), |
| + fade_in_delay_(fade_in_delay), |
| fade_out_delay_(fade_out_delay), |
| fade_out_resize_delay_(fade_out_resize_delay), |
| + fade_in_duration_(fade_in_duration), |
| + fade_out_duration_(fade_out_duration), |
| need_trigger_scrollbar_show_(false), |
| is_animating_(false), |
| + animation_change_(NONE), |
| scroll_layer_id_(scroll_layer_id), |
| currently_scrolling_(false), |
| show_in_fast_scroll_(false), |
| opacity_(0.0f), |
| - fade_out_duration_(fade_out_duration), |
| show_scrollbars_on_scroll_gesture_(true), |
| need_thinning_animation_(true), |
| weak_factory_(this) { |
| @@ -107,7 +113,8 @@ ScrollbarAnimationController::GetScrollbarAnimationController( |
| } |
| void ScrollbarAnimationController::StartAnimation() { |
| - delayed_scrollbar_show_.Cancel(); |
| + DCHECK(animation_change_ != NONE); |
| + delayed_scrollbar_fade_in_.Cancel(); |
| delayed_scrollbar_fade_out_.Cancel(); |
| is_animating_ = true; |
| last_awaken_time_ = base::TimeTicks(); |
| @@ -115,22 +122,26 @@ void ScrollbarAnimationController::StartAnimation() { |
| } |
| void ScrollbarAnimationController::StopAnimation() { |
| - delayed_scrollbar_show_.Cancel(); |
| + delayed_scrollbar_fade_in_.Cancel(); |
| delayed_scrollbar_fade_out_.Cancel(); |
| is_animating_ = false; |
| + animation_change_ = NONE; |
| } |
| -void ScrollbarAnimationController::PostDelayedShow() { |
| +void ScrollbarAnimationController::PostDelayedFadeIn() { |
| DCHECK(delayed_scrollbar_fade_out_.IsCancelled()); |
|
weiliangc
2017/04/18 16:45:21
Could this happen in the middle of FadeOut animati
|
| - delayed_scrollbar_show_.Cancel(); |
| - delayed_scrollbar_show_.Reset(base::Bind(&ScrollbarAnimationController::Show, |
| - weak_factory_.GetWeakPtr())); |
| - client_->PostDelayedScrollbarAnimationTask(delayed_scrollbar_show_.callback(), |
| - show_delay_); |
| + animation_change_ = FADE_IN; |
| + delayed_scrollbar_fade_in_.Cancel(); |
| + delayed_scrollbar_fade_in_.Reset( |
| + base::Bind(&ScrollbarAnimationController::StartAnimation, |
| + weak_factory_.GetWeakPtr())); |
| + client_->PostDelayedScrollbarAnimationTask( |
| + delayed_scrollbar_fade_in_.callback(), fade_in_delay_); |
| } |
| void ScrollbarAnimationController::PostDelayedFadeOut(bool on_resize) { |
| - DCHECK(delayed_scrollbar_show_.IsCancelled()); |
| + DCHECK(delayed_scrollbar_fade_in_.IsCancelled()); |
| + animation_change_ = FADE_OUT; |
| base::TimeDelta delay = on_resize ? fade_out_resize_delay_ : fade_out_delay_; |
| delayed_scrollbar_fade_out_.Cancel(); |
| delayed_scrollbar_fade_out_.Reset( |
| @@ -144,6 +155,7 @@ bool ScrollbarAnimationController::Animate(base::TimeTicks now) { |
| bool animated = false; |
| if (is_animating_) { |
| + DCHECK(animation_change_ != NONE); |
| if (last_awaken_time_.is_null()) |
| last_awaken_time_ = now; |
| @@ -166,12 +178,23 @@ bool ScrollbarAnimationController::Animate(base::TimeTicks now) { |
| float ScrollbarAnimationController::AnimationProgressAtTime( |
| base::TimeTicks now) { |
| base::TimeDelta delta = now - last_awaken_time_; |
| - float progress = delta.InSecondsF() / fade_out_duration_.InSecondsF(); |
| + base::TimeDelta duration = |
| + animation_change_ == FADE_IN ? fade_in_duration_ : fade_out_duration_; |
| + float progress = delta.InSecondsF() / duration.InSecondsF(); |
| return std::max(std::min(progress, 1.f), 0.f); |
| } |
| void ScrollbarAnimationController::RunAnimationFrame(float progress) { |
| - ApplyOpacityToScrollbars(1.f - progress); |
| + float opacity; |
| + |
| + DCHECK(animation_change_ != NONE); |
| + if (animation_change_ == FADE_IN) { |
| + opacity = std::max(progress, opacity_); |
| + } else { |
| + opacity = std::min(1.f - progress, opacity_); |
| + } |
| + |
| + ApplyOpacityToScrollbars(opacity); |
| if (progress == 1.f) |
| StopAnimation(); |
| } |
| @@ -268,7 +291,7 @@ void ScrollbarAnimationController::DidMouseLeave() { |
| vertical_controller_->DidMouseLeave(); |
| horizontal_controller_->DidMouseLeave(); |
| - delayed_scrollbar_show_.Cancel(); |
| + delayed_scrollbar_fade_in_.Cancel(); |
| need_trigger_scrollbar_show_ = false; |
| if (ScrollbarsHidden() || Captured()) |
| @@ -296,9 +319,9 @@ void ScrollbarAnimationController::DidMouseMoveNear( |
| if (ScrollbarsHidden()) { |
| if (need_trigger_scrollbar_show_before != need_trigger_scrollbar_show_) { |
| if (need_trigger_scrollbar_show_) { |
| - PostDelayedShow(); |
| + PostDelayedFadeIn(); |
| } else { |
| - delayed_scrollbar_show_.Cancel(); |
| + delayed_scrollbar_fade_in_.Cancel(); |
| } |
| } |
| } else { |
| @@ -324,7 +347,7 @@ bool ScrollbarAnimationController::CalcNeedTriggerScrollbarShow( |
| if (scrollbar->orientation() != orientation) |
| continue; |
| - if (distance < kMouseMoveDistanceToTriggerShow) |
| + if (distance < kMouseMoveDistanceToTriggerFadeIn) |
| return true; |
| } |
| @@ -359,7 +382,7 @@ bool ScrollbarAnimationController::Captured() const { |
| } |
| void ScrollbarAnimationController::Show() { |
| - delayed_scrollbar_show_.Cancel(); |
| + delayed_scrollbar_fade_in_.Cancel(); |
| ApplyOpacityToScrollbars(1.0f); |
| } |