Как изменить параметр @DrawableRes на Drawable в функции @Compose?

Функция изображения выводит изображение из идентификатора ресурса; нравиться 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?

1 ответ

Решение

Я не уверен в вашем сценарии, в котором вы нуждаетесь Drawable вместо данного API.

Но добиться этого можно следующим образом. Modifier.paint нужен только Painter Object, 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()
            )
        )
    )
}
Другие вопросы по тегам