Alex Styl
05/22/2024, 12:27 PMImageComposeScene
which works great.
However, I cannot figure out how to take a screenshot after its images are loaded using Coil. Code in 🧵Alex Styl
05/22/2024, 12:30 PMval requestCount = MutableStateFlow(0)
setSingletonImageLoaderFactory { context ->
val listener: coil3.EventListener = object : coil3.EventListener() {
override fun onStart(request: ImageRequest) {
super.onStart(request)
println("onStart ${request.data}")
requestCount.tryEmit(requestCount.value + 1)
}
override fun onCancel(request: ImageRequest) {
super.onCancel(request)
println("onCancel ${request.data}")
requestCount.tryEmit(requestCount.value - 1)
}
override fun onError(request: ImageRequest, result: ErrorResult) {
super.onError(request, result)
println("onError ${request.data}")
requestCount.tryEmit(requestCount.value - 1)
}
override fun onSuccess(request: ImageRequest, result: SuccessResult) {
super.onSuccess(request, result)
println("onSuccess ${request.data}")
requestCount.tryEmit(requestCount.value - 1)
}
}
ImageLoader.Builder(context).eventListener(listener)
// also applying disk + mem cache
.build()
LaunchEffect(Unit){
ImageComposeScene(width = 1200, height = 800) {
ComposableWithAsyncImage()
}.use { scene ->
scene.render(Long.MAX_VALUE) // <- tried this to kick-off image loading
println("Waiting until images are loaded. Request Count = ${requestCount.value}")
requestCount.first { it == 0 }
println("All images loaded. Taking screenshot Request Count = ${requestCount.value}")
val image = scene.render(Long.MAX_VALUE)
val data = image.encodeToData()!!
Files.write(file.toPath(), data.bytes)
println("Saved ${file.absolutePath}")
}
}
Alex Styl
05/22/2024, 12:31 PMAlex Styl
05/22/2024, 12:53 PMImageLoader
before the screenshots instead of waiting for the UI to preload them. seems to be working