blob: 1cf5d2053e2da099addb4652e0b9f75be3cb4b6e [file] [log] [blame]
package com.airbnb.lottie.value;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.LottieDrawable;
import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
/**
* Allows you to set a callback on a resolved {@link com.airbnb.lottie.model.KeyPath} to modify
* its animation values at runtime.
*
* If your dynamic property does the following, you must call {@link LottieAnimationView#invalidate()} or
* {@link LottieDrawable#invalidateSelf()} each time you want to update this value.
* 1. Use {@link com.airbnb.lottie.RenderMode.SOFTWARE}
* 2. Rendering a static image (the animation is either paused or there are no values
* changing within the animation itself)
* When using software rendering, Lottie caches the internal rendering bitmap. Whenever the animation changes
* internally, Lottie knows to invalidate the bitmap and re-render it on the next frame. If the animation
* never changes but your dynamic property does outside of Lottie, Lottie must be notified that it changed
* in order to set the bitmap as dirty and re-render it on the next frame.
*/
public class LottieValueCallback<T> {
private final LottieFrameInfo<T> frameInfo = new LottieFrameInfo<>();
@Nullable private BaseKeyframeAnimation<?, ?> animation;
/**
* This can be set with {@link #setValue(Object)} to use a value instead of deferring
* to the callback.
**/
@Nullable protected T value = null;
public LottieValueCallback() {
}
public LottieValueCallback(@Nullable T staticValue) {
value = staticValue;
}
/**
* Override this if you haven't set a static value in the constructor or with setValue.
* <p>
* Return null to resort to the default value.
*
* Refer to the javadoc for this class for a special case that requires manual invalidation
* each time you want to return something different from this method.
*/
@Nullable
public T getValue(LottieFrameInfo<T> frameInfo) {
return value;
}
public final void setValue(@Nullable T value) {
this.value = value;
if (animation != null) {
animation.notifyListeners();
}
}
@RestrictTo(RestrictTo.Scope.LIBRARY)
@Nullable
public final T getValueInternal(
float startFrame,
float endFrame,
T startValue,
T endValue,
float linearKeyframeProgress,
float interpolatedKeyframeProgress,
float overallProgress
) {
return getValue(
frameInfo.set(
startFrame,
endFrame,
startValue,
endValue,
linearKeyframeProgress,
interpolatedKeyframeProgress,
overallProgress
)
);
}
@RestrictTo(RestrictTo.Scope.LIBRARY)
public final void setAnimation(@Nullable BaseKeyframeAnimation<?, ?> animation) {
this.animation = animation;
}
}