如何在@Compose函数中将@DrawableRes参数更改为Drawable?

问题描述

图片功能从资源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对象,我们就可以使用ImagePainterVectorPainter来创建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()
            )
        )
    )
}