// Copyright 2015 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.
package org.chromium.chrome.browser.widget;
/**
* Progress bar animation logic that starts fast at the beginning and slows down approaching to the
* end.
*/
class ProgressAnimationFastStart implements ToolbarProgressBar.AnimationLogic {
// The speed unit is progress per second where 0 <= progress <= 1.
private static final float NORMALIZED_INITIAL_SPEED = 1.5f;
private static final float FINISHING_SPEED = 2.0f;
private float mProgress;
@Override
public void reset(float startProgress) {
mProgress = startProgress;
}
@Override
public float updateProgress(float targetProgress, float frameTimeSec, int resolution) {
assert mProgress <= targetProgress;
float progressChange;
if (targetProgress == 1.0f) {
progressChange = FINISHING_SPEED * frameTimeSec;
} else {
progressChange = (targetProgress - mProgress)
* (1.0f - (float) Math.exp(-frameTimeSec * NORMALIZED_INITIAL_SPEED));
}
mProgress = Math.min(mProgress + progressChange, targetProgress);
if (targetProgress - mProgress < 0.5f / resolution) mProgress = targetProgress;
return mProgress;
}
}