allow changing AnimatedValue properties without losing current progress
This also means changing easing function will not modify the progress
This commit is contained in:
parent
6850b59b84
commit
a9d8e10ff5
|
@ -58,6 +58,21 @@ public class AnimatedValue {
|
|||
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
|
||||
* @param min start value
|
||||
|
|
|
@ -312,4 +312,19 @@ public enum AnimationEquation {
|
|||
* @return the new {@code t} value [0,1]
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user