AnimationResult contains information about an animation at the end of the animation.
AnimatableAnimationResultSample
fun AnimatableAnimationResultSample() {
suspend fun CoroutineScope.animateBouncingOffBounds(
animatable: Animatable<Offset, *>,
flingVelocity: Offset,
parentSize: Size,
) {
launch {
var startVelocity = flingVelocity
// Set bounds for the animation, so that when it reaches bounds it will stop
// immediately. We can then inspect the returned `AnimationResult` and decide whether
// we should start another animation.
animatable.updateBounds(Offset(0f, 0f), Offset(parentSize.width, parentSize.height))
do {
val result = animatable.animateDecay(startVelocity, exponentialDecay())
// Copy out the end velocity of the previous animation.
startVelocity = result.endState.velocity
// Negate the velocity for the dimension that hits the bounds, to create a
// bouncing off the bounds effect.
with(animatable) {
if (value.x == upperBound?.x || value.x == lowerBound?.x) {
// x dimension hits bounds
startVelocity = startVelocity.copy(x = -startVelocity.x)
}
if (value.y == upperBound?.y || value.y == lowerBound?.y) {
// y dimension hits bounds
startVelocity = startVelocity.copy(y = -startVelocity.y)
}
}
// Repeat the animation until the animation ends for reasons other than hitting
// bounds, e.g. if `stop()` is called, or preempted by another animation.
} while (result.endReason == AnimationEndReason.BoundReached)
}
}
}