| package com.android.launcher3; |
| |
| import android.animation.TimeInterpolator; |
| |
| public class LogDecelerateInterpolator implements TimeInterpolator { |
| |
| int mBase; |
| int mDrift; |
| final float mLogScale; |
| |
| public LogDecelerateInterpolator(int base, int drift) { |
| mBase = base; |
| mDrift = drift; |
| |
| mLogScale = 1f / computeLog(1, mBase, mDrift); |
| } |
| |
| static float computeLog(float t, int base, int drift) { |
| return (float) -Math.pow(base, -t) + 1 + (drift * t); |
| } |
| |
| @Override |
| public float getInterpolation(float t) { |
| // Due to rounding issues, the interpolation doesn't quite reach 1 even though it should. |
| // To account for this, we short-circuit to return 1 if the input is 1. |
| return Float.compare(t, 1f) == 0 ? 1f : computeLog(t, mBase, mDrift) * mLogScale; |
| } |
| } |