Registers a callback to monitor whether or not the node is inside of the viewport of the window or not.
OnVisibilityChangedAutoplaySample
@Composable
fun OnVisibilityChangedAutoplaySample() {
@Composable
fun VideoFeed(feedData: List<Video>) {
LazyColumn {
items(feedData) { video ->
VideoRow(
video,
Modifier.onVisibilityChanged(minDurationMs = 500, minFractionVisible = 1f) {
visible ->
if (visible) video.play() else video.pause()
},
)
}
}
}
}
OnVisibilityChangedAutoplayWithViewportSample
@Composable
fun OnVisibilityChangedAutoplayWithViewportSample() {
@Composable
fun VideoFeed(feedData: List<Video>) {
val viewport = remember { LayoutBoundsHolder() }
LazyColumn(Modifier.layoutBounds(viewport)) {
items(feedData) { video ->
VideoRow(
video,
Modifier.onVisibilityChanged(
minDurationMs = 500,
minFractionVisible = 1f,
viewportBounds = viewport,
) { visible ->
if (visible) video.play() else video.pause()
},
)
}
}
}
}
OnVisibilityChangedDurationLoggingSample
@Composable
fun OnVisibilityChangedDurationLoggingSample() {
@Composable
fun VideoFeed(feedData: List<Video>, logger: Logger) {
LazyColumn {
items(feedData) { video ->
var startTime by remember { mutableLongStateOf(-1) }
VideoRow(
video,
Modifier.onVisibilityChanged(minDurationMs = 500, minFractionVisible = 1f) {
visible ->
if (visible) {
startTime = System.currentTimeMillis()
} else if (startTime >= 0) {
val durationMs = System.currentTimeMillis() - startTime
logger.logImpression(video.id, durationMs)
startTime = -1
}
},
)
}
}
}
}