我正在使用Jetpack Compose开发Android应用程序。
我有一个简单的页面。它有一个可滚动的列,如:
Column(
modifier = Modifier
.verticalScroll(rememberScrollState())
.fillMaxSize()
.padding(it)
.padding(bottom = 32.dp)
) {
if (!dataMap.isNullOrEmpty()) {
dataMap.entries.forEachIndexed { index, (key, value) ->
val header = key
val list = value
Text(text = title)
list.forEach { item ->
ItemUi(item)
}
}
}
}
实际上dataMap
并不简单,它有嵌套列表。无论如何,dataMap
的大小是有限的,它不是那么大。所以我只使用列而不是LazyColumn。
我有一个FAB按钮来共享屏幕。我可以写的代码采取当前屏幕和它的工作正常。
但问题是,它只需要截图当前可见区域,而不是完全滚动的区域。
我的takeScreenshot
函数如下:
private fun takeScreenShot(view: View, dir: File): File? {
try {
view.isDrawingCacheEnabled = true
val bitmap: Bitmap = Bitmap.createBitmap(view.drawingCache)
view.isDrawingCacheEnabled = false
val dateText = DateFormat.format("yyyy-MM-dd_hh:mm:ss", Date())
val imageFile = File("$dir/result-$dateText.jpeg")
FileOutputStream(imageFile).use { fos ->
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, fos)
fos.flush()
}
return imageFile
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
return null
}
这被称为:
@Composable
fun MyScreen() {
val activity = LocalContext.current as Activity
val requestPermissionLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
takeScreenShot(activity.window.decorView.rootView, activity.filesDir)
}
}
}
2条答案
按热度按时间wvt8vs2t1#
看这个jetpack-composable-to-bitmap-image
你可以膨胀一个无限的AndroidView并使用
drawToBitmap
将其转换为位图并从onClick方法存在的地方,声明
screenshotableComposable
,您从onClick调用screenshotableComposable.invoke()
,它将返回位图有一个问题是,您需要绘制两次内容,一次实际呈现在屏幕上,另一次在
screenshotableComposable
中呈现dgtucam12#
从Compose 1.6.0-alpha 01+开始,在Compose中有一种新的原生方式可以做到这一点:https://developer.android.com/jetpack/compose/graphics/draw/modifiers#composable-to-bitmap
要将图片转换为位图: