At monzo we implemented a shimmer modifier
fun Modifier.shimmer(
gradientAngle: Float = ShimmerAngle,
gradientWidth: Float = ShimmerWidth,
alphaLight: Float = ShimmerAlphaLight,
alphaDark: Float = ShimmerAlphaDark,
): Modifier = this.then(
composed {
val animatedValue by rememberInfiniteTransition().animateFloat(
initialValue = 0.0f,
targetValue = 1.0f,
animationSpec = ShimmerAnimationSpec
)
ShimmerModifier(
animatedVal = animatedValue,
isLight = Theme.isLight,
gradientAngle = gradientAngle,
gradientWidth = gradientWidth,
alphaLight = alphaLight,
alphaDark = alphaDark,
)
}
)
The Modifier itself is a class that extends
DrawCacheModifier
, and draws the gradient based on the animated value passed in.