| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/autofill/loading_animation.h" |
| |
| #include "base/logging.h" |
| #include "ui/gfx/animation/tween.h" |
| |
| namespace autofill { |
| |
| // Duration of one cycle of the animation. |
| static const int kDurationMs = 1800; |
| |
| // The frame rate of the animation. |
| static const int kHertz = 60; |
| |
| LoadingAnimation::LoadingAnimation(gfx::AnimationDelegate* delegate, |
| int font_height) |
| : LinearAnimation(kDurationMs, kHertz, delegate), |
| first_cycle_(true), |
| font_height_(font_height) {} |
| |
| LoadingAnimation::~LoadingAnimation() {} |
| |
| void LoadingAnimation::Step(base::TimeTicks time_now) { |
| LinearAnimation::Step(time_now); |
| |
| if (!is_animating()) { |
| first_cycle_ = false; |
| Start(); |
| } |
| } |
| |
| double LoadingAnimation::GetCurrentValueForDot(size_t dot_i) const { |
| double base_value = gfx::LinearAnimation::GetCurrentValue(); |
| |
| const double kSecondDotDelayMs = 100.0; |
| const double kThirdDotDelayMs = 300.0; |
| if (dot_i == 1) |
| base_value -= kSecondDotDelayMs / kDurationMs; |
| else if (dot_i == 2) |
| base_value -= kThirdDotDelayMs / kDurationMs; |
| |
| if (base_value < 0.0) |
| base_value = first_cycle_ ? 0.0 : base_value + 1.0; |
| |
| double value = gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, base_value); |
| |
| static AnimationFrame kAnimationFrames[] = { |
| { 0.0, 0.0 }, |
| { 0.55, 0.0 }, |
| { 0.6, -1.0 }, |
| { 0.8, 0.3 }, |
| { 0.9, -0.2 }, |
| { 0.95, 0.1 }, |
| { 1.0, 0.0 }, |
| }; |
| |
| for (size_t i = 0; i < arraysize(kAnimationFrames); ++i) { |
| if (value > kAnimationFrames[i].value) |
| continue; |
| |
| double position; |
| if (i == 0) { |
| position = kAnimationFrames[i].position; |
| } else { |
| double inter_frame_value = |
| (value - kAnimationFrames[i - 1].value) / |
| (kAnimationFrames[i].value - kAnimationFrames[i - 1].value); |
| position = gfx::Tween::FloatValueBetween(inter_frame_value, |
| kAnimationFrames[i - 1].position, |
| kAnimationFrames[i].position); |
| } |
| return position * font_height_ / 2.0; |
| } |
| |
| NOTREACHED(); |
| return 0.0; |
| } |
| |
| void LoadingAnimation::Reset() { |
| Stop(); |
| first_cycle_ = true; |
| } |
| |
| } // namespace autofill |