summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/RampUpScroller.java
diff options
context:
space:
mode:
authorMindy DelliCarpini <mindyp@google.com>2013-07-03 08:23:13 -0700
committerMindy DelliCarpini <mindyp@google.com>2013-07-03 14:28:32 -0700
commit53b8d071ce63b2b55fa8bdc71488c44308bfcf2f (patch)
treec75d766c9b439c140f975b82924cffb2a9cc02b5 /src/com/android/launcher3/RampUpScroller.java
parentfe7750b5d6cb76a3aa7b1b479e4cc243653fa0c1 (diff)
downloadandroid_packages_apps_Trebuchet-53b8d071ce63b2b55fa8bdc71488c44308bfcf2f.tar.gz
android_packages_apps_Trebuchet-53b8d071ce63b2b55fa8bdc71488c44308bfcf2f.tar.bz2
android_packages_apps_Trebuchet-53b8d071ce63b2b55fa8bdc71488c44308bfcf2f.zip
Use autoscroller to handle drag scrolling
Change-Id: Ie094cbfa91f898133f84ad9ffc349d8cfa07e668
Diffstat (limited to 'src/com/android/launcher3/RampUpScroller.java')
-rw-r--r--src/com/android/launcher3/RampUpScroller.java120
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;
+ }
+}