Class

StampedPathEffectStyle

Strategy for transforming each point of the shape along the drawn path

StampedPathEffectSample

@Composable
fun StampedPathEffectSample() {
    val size = 20f
    val square =
        Path().apply {
            lineTo(size, 0f)
            lineTo(size, size)
            lineTo(0f, size)
            close()
        }
    Column(modifier = Modifier.fillMaxHeight().wrapContentSize(Alignment.Center)) {
        val canvasModifier = Modifier.requiredSize(80.dp).align(Alignment.CenterHorizontally)
        // StampedPathEffectStyle.Morph will modify the lines of the square to be curved to fit
        // the curvature of the circle itself. Each stamped square will be rendered as an arc
        // that is fully contained by the bounds of the circle itself
        Canvas(modifier = canvasModifier) {
            drawCircle(color = Color.Blue)
            drawCircle(
                color = Color.Red,
                style =
                    Stroke(
                        pathEffect =
                            PathEffect.stampedPathEffect(
                                shape = square,
                                style = StampedPathEffectStyle.Morph,
                                phase = 0f,
                                advance = 30f,
                            )
                    ),
            )
        }
        Spacer(modifier = Modifier.requiredSize(10.dp))
        // StampedPathEffectStyle.Rotate will draw the square repeatedly around the circle
        // such that each stamped square is centered on the circumference of the circle and is
        // rotated along the curvature of the circle itself
        Canvas(modifier = canvasModifier) {
            drawCircle(color = Color.Blue)
            drawCircle(
                color = Color.Red,
                style =
                    Stroke(
                        pathEffect =
                            PathEffect.stampedPathEffect(
                                shape = square,
                                style = StampedPathEffectStyle.Rotate,
                                phase = 0f,
                                advance = 30f,
                            )
                    ),
            )
        }
        Spacer(modifier = Modifier.requiredSize(10.dp))
        // StampedPathEffectStyle.Translate will draw the square repeatedly around the circle
        // with the top left of each stamped square on the circumference of the circle
        Canvas(modifier = canvasModifier) {
            drawCircle(color = Color.Blue)
            drawCircle(
                color = Color.Red,
                style =
                    Stroke(
                        pathEffect =
                            PathEffect.stampedPathEffect(
                                shape = square,
                                style = StampedPathEffectStyle.Translate,
                                phase = 0f,
                                advance = 30f,
                            )
                    ),
            )
        }
    }
}