16c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohenpackage com.android.launcher3;
26c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen
36c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohenimport android.animation.TimeInterpolator;
46c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen
56c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohenpublic class LogAccelerateInterpolator implements TimeInterpolator {
66c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen
76c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    int mBase;
86c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    int mDrift;
96c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    final float mLogScale;
106c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen
116c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    public LogAccelerateInterpolator(int base, int drift) {
126c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen        mBase = base;
136c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen        mDrift = drift;
146c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen        mLogScale = 1f / computeLog(1, mBase, mDrift);
156c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    }
166c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen
176c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    static float computeLog(float t, int base, int drift) {
186c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen        return (float) -Math.pow(base, -t) + 1 + (drift * t);
196c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    }
206c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen
216c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    @Override
226c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    public float getInterpolation(float t) {
23bd42ba73b23d0470b675af73a721fc1d019be39dTony Wickham        // Due to rounding issues, the interpolation doesn't quite reach 1 even though it should.
24bd42ba73b23d0470b675af73a721fc1d019be39dTony Wickham        // To account for this, we short-circuit to return 1 if the input is 1.
25bd42ba73b23d0470b675af73a721fc1d019be39dTony Wickham        return Float.compare(t, 1f) == 0 ? 1f : 1 - computeLog(1 - t, mBase, mDrift) * mLogScale;
266c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen    }
276c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen}
28