Last active
December 30, 2020 03:31
-
-
Save Kraiden/1390f1ac52a04e08b83e2d8b5a408aca to your computer and use it in GitHub Desktop.
A more configurable bounce interpolator for Android animations
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@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