SurfaceScope
-
android
interface SurfaceScope
SurfaceCoroutineScope |
|
SurfaceScope is a scoped environment provided by AndroidExternalSurface and AndroidEmbeddedExternalSurface to handle Surface lifecycle events.
import androidx.compose.foundation.AndroidExternalSurface import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.runtime.withFrameNanos import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.lerp import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.unit.dp 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) } } } } }
Summary
Public functions |
||
|---|---|---|
Unit |
Invokes |
android
|
Unit |
Surface.onDestroyed(onDestroyed: Surface.() -> Unit)Invokes |
android
|
Public functions
Surface.onChanged
fun Surface.onChanged(onChanged: Surface.(width: Int, height: Int) -> Unit): Unit
Invokes onChanged when the surface's geometry (width and height) changes. Always invoked on the main thread.
Surface.onDestroyed
fun Surface.onDestroyed(onDestroyed: Surface.() -> Unit): 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.