1 package com.android.launcher3; 2 3 import android.animation.TimeInterpolator; 4 5 public class LogDecelerateInterpolator implements TimeInterpolator { 6 7 int mBase; 8 int mDrift; 9 final float mLogScale; 10 LogDecelerateInterpolator(int base, int drift)11 public LogDecelerateInterpolator(int base, int drift) { 12 mBase = base; 13 mDrift = drift; 14 15 mLogScale = 1f / computeLog(1, mBase, mDrift); 16 } 17 computeLog(float t, int base, int drift)18 static float computeLog(float t, int base, int drift) { 19 return (float) -Math.pow(base, -t) + 1 + (drift * t); 20 } 21 22 @Override getInterpolation(float t)23 public float getInterpolation(float t) { 24 // Due to rounding issues, the interpolation doesn't quite reach 1 even though it should. 25 // To account for this, we short-circuit to return 1 if the input is 1. 26 return Float.compare(t, 1f) == 0 ? 1f : computeLog(t, mBase, mDrift) * mLogScale; 27 } 28 } 29