SurfaceScope

Interface

Android
interface SurfaceScope

SurfaceScope is a scoped environment provided by AndroidExternalSurface and AndroidEmbeddedExternalSurface to handle Surface lifecycle events.

Functions

fun Surface.onChanged(onChanged: Surface.(width: Int, height: Int) -> Unit)

Invokes onChanged when the surface's geometry (width and height) changes. Always invoked on the main thread.

fun Surface.onDestroyed(onDestroyed: Surface.() -> Unit)

Invokes onDestroyed when the surface is destroyed. All rendering into the surface should stop immediately after onDestroyed is invoked. Always invoked on the main thread.

Code Examples

AndroidExternalSurfaceColors

@Composable
fun AndroidExternalSurfaceColors() {
    AndroidExternalSurface(modifier = Modifier.fillMaxWidth().height(400.dp)) {
        // Resources can be initialized/cached here
        // A surface is available, we can start rendering
        onSurface { surface, width, height ->
            var w = width
            var h = height
            // Initial draw to avoid a black frame
            surface.lockCanvas(Rect(0, 0, w, h)).apply {
                drawColor(Color.Blue.toArgb())
                surface.unlockCanvasAndPost(this)
            }
            // React to surface dimension changes
            surface.onChanged { newWidth, newHeight ->
                w = newWidth
                h = newHeight
            }
            // Cleanup if needed
            surface.onDestroyed {}
            // Render loop, automatically cancelled on surface destruction
            while (true) {
                withFrameNanos { time ->
                    surface.lockCanvas(Rect(0, 0, w, h)).apply {
                        val timeMs = time / 1_000_000L
                        val t = 0.5f + 0.5f * sin(timeMs / 1_000.0f)
                        drawColor(lerp(Color.Blue, Color.Green, t).toArgb())
                        surface.unlockCanvasAndPost(this)
                    }
                }
            }
        }
    }
}