allow changing AnimatedValue properties without losing current progress

This also means changing easing function will not modify the progress
This commit is contained in:
yugecin 2018-07-07 01:42:37 +02:00
parent 6850b59b84
commit a9d8e10ff5
No known key found for this signature in database
GPG Key ID: 2C5AC035A7068E44
2 changed files with 30 additions and 0 deletions

View File

@ -58,6 +58,21 @@ public class AnimatedValue {
this.eqn = eqn; this.eqn = eqn;
} }
public void change(int duration, float min, float max, AnimationEquation eqn) {
float progress = (float) this.time / this.duration;
if (this.eqn != eqn) {
if (this.time != 0 && this.time != this.duration) {
progress = this.eqn.uncalc(progress);
}
this.eqn = eqn;
}
this.duration = duration;
this.time = (int) (this.duration * progress);
this.base = min;
this.diff = max - min;
this.updateValue();
}
/** /**
* Change the from and to values * Change the from and to values
* @param min start value * @param min start value

View File

@ -312,4 +312,19 @@ public enum AnimationEquation {
* @return the new {@code t} value [0,1] * @return the new {@code t} value [0,1]
*/ */
public abstract float calc(float t); public abstract float calc(float t);
public float uncalc(float x) {
float min = 0f;
float max = 1f;
// 7 iterations is already decent, do we need 8?
for (int i = 0; i < 8; i++) {
float pos = (min + max) / 2f;
if (this.calc(pos) > x) {
max = pos;
} else {
min = pos;
}
}
return (min + max) / 2f;
}
} }