I would simply draw it on Canvas with a modifier.
Somethink like this could be a starting point:
fun Modifier.pulse(
color: Color = Color.Magenta,
count: Int = 3,
duration: Int = 5_000,
easing: Easing = LinearEasing,
): Modifier = composed {
val transition = rememberInfiniteTransition()
val progress = List(count) {
transition.animateFloat(
initialValue = 0f,
targetValue = 1f,
animationSpec = InfiniteRepeatableSpec(
animation = tween(
durationMillis = duration,
easing = easing
),
initialStartOffset = StartOffset(it * duration / count),
repeatMode = RepeatMode.Restart,
)
)
}
drawBehind {
val radius = min(size.width, size.height) / 2f
progress.forEach {
drawCircle(
color = color.copy(alpha = 1f - it.value),
radius = radius * it.value
)
}
}
}
Usage:
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.size(100.dp)
.pulse()
) {
Icon(
imageVector = Icons.Default.AccountCircle,
contentDescription = null,
)
}
}