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