/* * Copyright (C) 2013 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.android.launcher3; import android.view.animation.AccelerateInterpolator; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; /** * Scroller that gradually reaches a target velocity. */ class RampUpScroller { private final Interpolator mInterpolator; private final long mRampUpTime; private long mStartTime; private long mDeltaTime; private float mTargetVelocityX; private float mTargetVelocityY; private int mDeltaX; private int mDeltaY; /** * Creates a new ramp-up scroller that reaches full velocity after a * specified duration. * * @param rampUpTime Duration before the scroller reaches target velocity. */ public RampUpScroller(long rampUpTime) { mInterpolator = new AccelerateInterpolator(); mRampUpTime = rampUpTime; } /** * Starts the scroller at the current animation time. */ public void start() { mStartTime = AnimationUtils.currentAnimationTimeMillis(); mDeltaTime = mStartTime; } /** * Computes the current scroll deltas. This usually only be called after * starting the scroller with {@link #start()}. * * @see #getDeltaX() * @see #getDeltaY() */ public void computeScrollDelta() { final long currentTime = AnimationUtils.currentAnimationTimeMillis(); final long elapsedSinceStart = currentTime - mStartTime; final float scale; if (elapsedSinceStart < mRampUpTime) { scale = mInterpolator.getInterpolation((float) elapsedSinceStart / mRampUpTime); } else { scale = 1f; } final long elapsedSinceDelta = currentTime - mDeltaTime; mDeltaTime = currentTime; mDeltaX = (int) (elapsedSinceDelta * scale * mTargetVelocityX); mDeltaY = (int) (elapsedSinceDelta * scale * mTargetVelocityY); } /** * Sets the target velocity for this scroller. * * @param x The target X velocity in pixels per millisecond. * @param y The target Y velocity in pixels per millisecond. */ public void setTargetVelocity(float x, float y) { mTargetVelocityX = x; mTargetVelocityY = y; } /** * @return The target X velocity for this scroller. */ public float getTargetVelocityX() { return mTargetVelocityX; } /** * @return The target Y velocity for this scroller. */ public float getTargetVelocityY() { return mTargetVelocityY; } /** * The distance traveled in the X-coordinate computed by the last call to * {@link #computeScrollDelta()}. */ public int getDeltaX() { return mDeltaX; } /** * The distance traveled in the Y-coordinate computed by the last call to * {@link #computeScrollDelta()}. */ public int getDeltaY() { return mDeltaY; } }