public final class

FloatAnim

extends Object
/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.cooliris.media;

import android.util.FloatMath;

public final class FloatAnim {
    private float mValue;
    private float mDelta;
    private float mDuration;
    private long mStartTime;

    public FloatAnim(float value) {
        mValue = value;
        mStartTime = 0;
    }

    public boolean isAnimating() {
        return mStartTime != 0;
    }

    public float getTimeRemaining(long currentTime) {
        float duration = (currentTime - mStartTime) * 0.001f;
        if (mDuration > duration) // CR: braces
            return mDuration - duration;
        else
            return 0.0f;
    }

    public float getValue(long currentTime) {
        if (mStartTime == 0) {
            return mValue;
        } else {
            return getInterpolatedValue(currentTime);
        }
    }

    public void animateValue(float value, float duration, long currentTime) {
        mDelta = getValue(currentTime) - value;
        mValue = value;
        mDuration = duration;
        mStartTime = currentTime;
    }

    public void setValue(float value) {
        mValue = value;
        mStartTime = 0;
    }

    public void skip() {
        mStartTime = 0;
    }

    private float getInterpolatedValue(long currentTime) {
        float ratio = (float) (currentTime - mStartTime) * 0.001f / mDuration;
        if (ratio >= 1f) { // CR: 1.0f
            mStartTime = 0;
            return mValue;
        } else {
            ratio = 0.5f - 0.5f * FloatMath.cos(ratio * 3.14159265f); // CR:
                                                                      // (float)Math.PI
            return mValue + (1f - ratio) * mDelta;
        }
    }
}