Skip to content

Instantly share code, notes, and snippets.

@mhrohani1385
Created December 19, 2022 12:21
Show Gist options
  • Save mhrohani1385/893fa269d42c658b6d71509491560a6f to your computer and use it in GitHub Desktop.
Save mhrohani1385/893fa269d42c658b6d71509491560a6f to your computer and use it in GitHub Desktop.
Convert Composable To Bitmap Without Displaying It
@Composable
fun BitmapComposable(
onBitmapped: (bitmap: Bitmap) -> Unit = { _ -> },
backgroundColor: Color = Color.Transparent,
dpSize : DpSize,
readyToDraw : State<Boolean> = mutableStateOf(true),
composable: @Composable () -> Unit
) {
var lastBitmap : Bitmap? = remember {
null
}
LaunchedEffect(key1 = readyToDraw.value, block = {
Log.d("readyToDraw", "ready ! to draw")
if (readyToDraw.value && lastBitmap != null) {
onBitmapped(lastBitmap!!)
}
})
Box(
modifier = Modifier
.size(0.dp, 0.dp)
.verticalScroll(
rememberScrollState(), enabled = false
)
.horizontalScroll(
rememberScrollState(), enabled = false
)
) {
Box(modifier = Modifier.size(dpSize)) {
AndroidView(factory = {
ComposeView(it).apply {
setContent {
Box(modifier = Modifier
.background(backgroundColor)
.size(dpSize)) {
composable()
}
}
}
}, modifier = Modifier.fillMaxSize(), update = {
it.run {
doOnLayout {
if (readyToDraw.value) {
lastBitmap = drawToBitmap()
}
}
}
})
}
}
}
@Composable
fun BitmapComposable(
onBitmapped: (bitmap: Bitmap) -> Unit = { _ -> },
backgroundColor: Color = Color.Transparent,
intSize : IntSize = StudentCardSize,
readyToDraw : State<Boolean> = mutableStateOf(true),
composable: @Composable () -> Unit
) {
val renderComposableSize = LocalDensity.current.run { intSize.toSize().toDpSize() }
BitmapComposable(onBitmapped,backgroundColor,renderComposableSize,readyToDraw,composable)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment