Skip to content

Instantly share code, notes, and snippets.

@Kraiden
Last active December 30, 2020 03:31
Show Gist options
  • Save Kraiden/1390f1ac52a04e08b83e2d8b5a408aca to your computer and use it in GitHub Desktop.
Save Kraiden/1390f1ac52a04e08b83e2d8b5a408aca to your computer and use it in GitHub Desktop.
A more configurable bounce interpolator for Android animations
import android.view.animation.Interpolator;
import static java.lang.Math.*;
public class BetterBounceInterpolator implements Interpolator {
private int mBounces;
private double mEnergy;
/** Have more control over how to bounce your values.
*
*/
public BetterBounceInterpolator(){
this(3);
}
/** Have more control over how to bounce your values.
*
* @param bounces number of times to bounce before coming to a rest
*/
public BetterBounceInterpolator(int bounces){
this(bounces, 0.3f);
}
/** Have more control over how to bounce your values.
*
* @param bounces number of times to bounce before coming to a rest
* @param energyFactor control how the bounce loses momentum. 0 is lose energy linearly. 1 energy loss slows down over time, -1 energy loss speeds up over time. Values greater than 1 and less than -1 cause over/under bounce
*/
public BetterBounceInterpolator(int bounces, double energyFactor){
mBounces = bounces;
mEnergy = energyFactor + 0.5;
}
@Override public float getInterpolation(float x) {
return (float) (1d + (-abs(cos(x * 10 * mBounces/PI)) * getCurveAdjustment(x)));
}
private double getCurveAdjustment(double x){
return -(2 * (1 - x) * x * mEnergy + x * x) + 1;
}
}
@Kraiden
Copy link
Author

Kraiden commented Jul 25, 2019

@nininea1 I don't think you can really do that. The parameters basically just tweak a sine wave. I'm not sure you can convert real world values

@Abhiank Here you go. Disclaimer: I haven't actually tried this for an animation. interpolators are supposed to be from 0 - 1. This goes from 0 - 1 - 0, meaning you'll need to play with the value you're animating a bit. I suspect you'll need to set the animated value yourself at the end of the animation. Eg: if you're bouncing x from 0 - 5, you'll need to manually set x back to 0 at the end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment