summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/RampUpScroller.java
blob: 89eb5798e64b306b0fc801c24459617f6d450d69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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;
    }
}