Skip to content

Capture screenshot of Composables and Views (multiplatform)

License

Notifications You must be signed in to change notification settings

mahozad/comshot

Repository files navigation

Kotlin version Compose Multiplatform version Latest Maven Central release


Comshot

Multiplatform library to take/capture screenshot/snapshot/picture/image of @Composables (and also Android Views).

⚠️⚠️ This is very experimental and tested only on Windows and Android. ⚠️⚠️
⚠️⚠️ It may not be suited for use in production code. ⚠️⚠️

Usage

implementation("ir.mahozad.multiplatform:comshot:0.3.0")
  • Android (Composable)
    You need to pass your activity to captureToImage. Also, it should be called from the Main aka UI thread (see its KDoc for more information).
    @Composable
    fun Activity.MyComposable() {
        val activity = this
        var screenshot by remember { mutableStateOf<ImageBitmap?>(null) }
        val composable: @Composable () -> Unit = remember {
            @Composable {
                Row {
                    Text(text = "Hello")
                    Text(text = "Meow!")
                }
            }
        }
        // You can also render your composable simply like this:
        // composable()
        Column {
            Button(onClick = { screenshot = captureToImage(activity, composable) }) {
                Text(text = "Capture")
            }
            screenshot?.let {
                Image(
                    bitmap = it,
                    modifier = Modifier.width(200.dp),
                    contentDescription = null
                )
            }
        }
    }
  • Android (View)
    val view = findViewById<TextView>(R.id.myTextView)
    val screenshot = captureToImage(view)
    // If you want Bitmap:
    val androidBitmap = screenshot.asAndroidBitmap()
  • Other targets
    @Composable
    fun MyComposable() {
        var screenshot by remember { mutableStateOf<ImageBitmap?>(null) }
        val composable: @Composable () -> Unit = remember {
            @Composable {
                Row {
                    Text(text = "Hello")
                    Text(text = "Meow!")
                }
            }
        }
        // You can also render your composable simply like this:
        // composable()
        Column {
            Button(onClick = { screenshot = captureToImage(composable) }) {
                Text(text = "Capture")
            }
            screenshot?.let {
                Image(
                    bitmap = it,
                    modifier = Modifier.width(200.dp),
                    contentDescription = null
                )
            }
        }
    }

Related