---
title: "SurfaceCoroutineScope"
description: "[SurfaceCoroutineScope] is a scoped environment provided by [AndroidExternalSurface] and
[AndroidEmbeddedExternalSurface] when a new [Surface] is created. This environment is a coroutine
scope that also provides access to a [SurfaceScope] environment which can itself be used to
handle other [Surface] lifecycle events."
type: "interface"
---

<div class='type'>Interface</div>


<a id='references'></a>

<div class='sourceset sourceset-android'>Android</div>



```kotlin
interface SurfaceCoroutineScope : SurfaceScope, CoroutineScope
```


`SurfaceCoroutineScope` is a scoped environment provided by `AndroidExternalSurface` and
`AndroidEmbeddedExternalSurface` when a new `Surface` is created. This environment is a coroutine
scope that also provides access to a `SurfaceScope` environment which can itself be used to
handle other `Surface` lifecycle events.



## Code Examples

### AndroidExternalSurfaceColors
```kotlin
@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)
                    }
                }
            }
        }
    }
}
```

