如何使用 Jetpack Compose 在我的屏幕上使用 9 patch drawable (.9.png)?
How to use a 9 patch drawable (.9.png) in my screen using Jetpack Compose?
我正在尝试在 Image composable 中使用 .9.png 文件作为 :
Image(
painter = painterResource(id = R.drawable.shadow_faq),
contentDescription = "Faq card 1",
modifier = Modifier
.constrainAs(imgGeneral) {
top.linkTo(glImgGeneralTop)
bottom.linkTo(glImgBottom)
start.linkTo(glImgLeft)
end.linkTo(glImgRight)
height = Dimension.fillToConstraints
width = Dimension.fillToConstraints
}
)
但是在这样做时我遇到了一个渲染问题 java.lang.IllegalArgumentException: Only VectorDrawables and rasterized asset types are supported ex. PNG, JPG
如何在 Jetpack Compose 中使用 .9.png 文件?
您可以使用伴奏中的 DrawablePainter
returns 一个 Painter
绘制一个 Android Drawable
.
Image(
rememberDrawablePainter(drawable = ContextCompat.getDrawable(context,R.drawable.xxxx) ),
contentDescription = "Faq card 1"
)
更新:从1.0.0-rc02
和伴奏者0.14.0
开始,您可以使用coil-compose版本:
Image(
rememberImagePainter(ContextCompat.getDrawable(context,R.drawable.xxx)),
contentDescription = "Faq card 1",
)
已编辑:请使用Gabriele答案。
我尝试了 Gabriele 解决方案,但当我设置特定尺寸(如 100x200)时,它对我不起作用。
这是我的解决方案...
val context = LocalContext.current
val (w, h) = with(LocalDensity.current) {
200.dp.roundToPx() to 100.dp.roundToPx()
}
val image = remember {
ContextCompat.getDrawable(context, R.drawable.balao)?.toBitmap(w, h)?.asImageBitmap()!!
}
Image(image, contentDescription = null)
有时,我们加载 9.png 作为视图的背景,就像聊天应用程序中的消息项一样。我们可以这样做:
首先我们将 9.png 作为可绘制对象加载:
val bgImg = ContextCompat.getDrawable(
LocalContext.current,
if (isFromMe) R.drawable.chat_message_right else R.drawable.chat_message_left
)
其次我们可以使用 Modifier#drawBehind() 方法设置背景:
Text(text = "This my message",
modifier = Modifier
.drawBehind {
bgImg?.updateBounds(0, 0, size.width.toInt(), size.height.toInt())
bgImg?.draw(drawContext.canvas.nativeCanvas)
}
.padding(8.dp)
)
最后,你会得到你想要的效果。
我正在尝试在 Image composable 中使用 .9.png 文件作为 :
Image(
painter = painterResource(id = R.drawable.shadow_faq),
contentDescription = "Faq card 1",
modifier = Modifier
.constrainAs(imgGeneral) {
top.linkTo(glImgGeneralTop)
bottom.linkTo(glImgBottom)
start.linkTo(glImgLeft)
end.linkTo(glImgRight)
height = Dimension.fillToConstraints
width = Dimension.fillToConstraints
}
)
但是在这样做时我遇到了一个渲染问题 java.lang.IllegalArgumentException: Only VectorDrawables and rasterized asset types are supported ex. PNG, JPG
如何在 Jetpack Compose 中使用 .9.png 文件?
您可以使用伴奏中的 DrawablePainter
returns 一个 Painter
绘制一个 Android Drawable
.
Image(
rememberDrawablePainter(drawable = ContextCompat.getDrawable(context,R.drawable.xxxx) ),
contentDescription = "Faq card 1"
)
更新:从1.0.0-rc02
和伴奏者0.14.0
开始,您可以使用coil-compose版本:
Image(
rememberImagePainter(ContextCompat.getDrawable(context,R.drawable.xxx)),
contentDescription = "Faq card 1",
)
已编辑:请使用Gabriele答案。
我尝试了 Gabriele 解决方案,但当我设置特定尺寸(如 100x200)时,它对我不起作用。
这是我的解决方案...
val context = LocalContext.current
val (w, h) = with(LocalDensity.current) {
200.dp.roundToPx() to 100.dp.roundToPx()
}
val image = remember {
ContextCompat.getDrawable(context, R.drawable.balao)?.toBitmap(w, h)?.asImageBitmap()!!
}
Image(image, contentDescription = null)
有时,我们加载 9.png 作为视图的背景,就像聊天应用程序中的消息项一样。我们可以这样做:
首先我们将 9.png 作为可绘制对象加载:
val bgImg = ContextCompat.getDrawable(
LocalContext.current,
if (isFromMe) R.drawable.chat_message_right else R.drawable.chat_message_left
)
其次我们可以使用 Modifier#drawBehind() 方法设置背景:
Text(text = "This my message",
modifier = Modifier
.drawBehind {
bgImg?.updateBounds(0, 0, size.width.toInt(), size.height.toInt())
bgImg?.draw(drawContext.canvas.nativeCanvas)
}
.padding(8.dp)
)
最后,你会得到你想要的效果。