blob: 77c93cec51ba40a1211097b413941bdf80f2b551 [file] [log] [blame]
package com.airbnb.lottie;
import android.view.animation.Interpolator;
import java.util.List;
import static com.airbnb.lottie.MiscUtils.lerp;
class NumberKeyframeAnimation<T extends Number> extends KeyframeAnimation<T> {
private final List<T> values;
private final Class<T> klass;
NumberKeyframeAnimation(long duration, LottieComposition composition, List<Float> keyTimes,
Class<T> klass, List<T> values, List<Interpolator> interpolators) {
super(duration, composition, keyTimes, interpolators);
this.klass = klass;
if (keyTimes.size() != values.size()) {
throw new IllegalArgumentException(
"Key times and values must be the same length " + keyTimes + " vs " + values);
}
this.values = values;
}
@Override T getValue() {
if (progress <= 0f) {
return values.get(0);
} else if (progress >= 1f) {
return values.get(values.size() - 1);
}
int keyframeIndex = getKeyframeIndex();
float startKeytime = keyTimes.get(keyframeIndex);
float endKeytime = keyTimes.get(keyframeIndex + 1);
float percentageIntoFrame = 0;
if (!isDiscrete) {
percentageIntoFrame = (progress - startKeytime) / (endKeytime - startKeytime);
if (interpolators != null) {
percentageIntoFrame =
interpolators.get(keyframeIndex).getInterpolation(percentageIntoFrame);
}
}
Number startValue = values.get(keyframeIndex);
Number endValue = values.get(keyframeIndex + 1);
if (klass.isAssignableFrom(Integer.class)) {
return klass.cast(lerp(startValue.intValue(), endValue.intValue(), percentageIntoFrame));
} else {
return klass.cast(lerp(startValue.floatValue(), endValue.floatValue(), percentageIntoFrame));
}
}
}