diff options
Diffstat (limited to 'src/com/android/launcher3/RampUpScroller.java')
-rw-r--r-- | src/com/android/launcher3/RampUpScroller.java | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/com/android/launcher3/RampUpScroller.java b/src/com/android/launcher3/RampUpScroller.java new file mode 100644 index 000000000..89eb5798e --- /dev/null +++ b/src/com/android/launcher3/RampUpScroller.java @@ -0,0 +1,120 @@ +/* + * 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; + } +} |