如何在@Compose 函数中将@DrawableRes 参数更改为Drawable?
How to change @DrawableRes parameter to Drawable in @Compose function?
图片函数根据资源id绘制图片;像 R.drawable.icon
.
@Composable
fun Picture(@DrawableRes resId: Int, modifier: Modifier = Modifier) {
val rectModifier = loadVectorResource(resId).resource.resource
?.let { asset ->
modifier.paint(
painter = VectorPainter(asset)
)
}
?: modifier
Box(modifier = rectModifier)
}
我该如何更改它,使其使用 Drawable
参数而不是 @DrawableRes
?
我不确定你的场景,你需要 Drawable
而不是给定的 API。
但是我们可以通过下面的方式实现。 Modifier.paint
只需要一个 Painter
对象,我们可以使用 ImagePainter
和 VectorPainter
.
创建 Painter
在我们的例子中,我们想要使用Drawable,所以我们可以使用ImagePainter
,它需要ImageAsset
,所以我们可以使用Bitmap
来创建ImageAsset
。
所以最终结果会是这样的:
@Composable
fun Picture(@DrawableRes resId: Int, modifier: Modifier = Modifier) {
val resources = ResourcesCompat.getDrawable(ContextAmbient.current.resources, resId, null)
resources?.let {
Picture(drawable = it, modifier = modifier)
}
}
@Composable
fun Picture(drawable: Drawable, modifier: Modifier = Modifier) {
Box(
modifier = modifier.paint(
ImagePainter(
drawable.toBitmap().asImageAsset()
)
)
)
}
图片函数根据资源id绘制图片;像 R.drawable.icon
.
@Composable
fun Picture(@DrawableRes resId: Int, modifier: Modifier = Modifier) {
val rectModifier = loadVectorResource(resId).resource.resource
?.let { asset ->
modifier.paint(
painter = VectorPainter(asset)
)
}
?: modifier
Box(modifier = rectModifier)
}
我该如何更改它,使其使用 Drawable
参数而不是 @DrawableRes
?
我不确定你的场景,你需要 Drawable
而不是给定的 API。
但是我们可以通过下面的方式实现。 Modifier.paint
只需要一个 Painter
对象,我们可以使用 ImagePainter
和 VectorPainter
.
在我们的例子中,我们想要使用Drawable,所以我们可以使用ImagePainter
,它需要ImageAsset
,所以我们可以使用Bitmap
来创建ImageAsset
。
所以最终结果会是这样的:
@Composable
fun Picture(@DrawableRes resId: Int, modifier: Modifier = Modifier) {
val resources = ResourcesCompat.getDrawable(ContextAmbient.current.resources, resId, null)
resources?.let {
Picture(drawable = it, modifier = modifier)
}
}
@Composable
fun Picture(drawable: Drawable, modifier: Modifier = Modifier) {
Box(
modifier = modifier.paint(
ImagePainter(
drawable.toBitmap().asImageAsset()
)
)
)
}