如何使用 Jetpack Compose 在我的屏幕中使用 9 patch drawable (.9.png)?

问题描述

我正在尝试在可组合图像中使用 .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 文件

解决方法

您可以使用 Accompanist 中的 DrawablePainter,它返回一个 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 等特定尺寸时对我不起作用。

这是我的解决方案...

in_str='abcd1234'
size=12 # or 4
def make_str_this_len(in_str,size):
    if size<=len(in_str):
        out_str = in_str[0:size]
    else:
        out_str = in_str.ljust(size)
    return out_str

# printing string and its length
res=make_str_this_len(in_str,size)
print("resulting string:[{0}],len={1}".format(res,len(res)))
,

由于coil-compose从伴奏中移出,记住DrawablePainter become private

但是没有理由使用内部 api:rememberImagePainter (prev rememberCoilPainter) 将任何对象作为数据,包括 drawable:

@Composable
fun rememberDrawablePainter(@DrawableRes id: Int): ImagePainter {
    val context = LocalContext.current
    val drawable = remember {
        ContextCompat.getDrawable(context,id)
    }
    return rememberImagePainter(data = drawable)
}

您需要在记住内部初始化 drawable 以防止在每次重绘时重新创建它。

附言不要忘记添加implementation("io.coil-kt:coil-compose:$coilVersion")

但这仍然不是最佳解决方案,因为 ContextCompat.getDrawable 被每个视图调用,并且如果屏幕上有许多视图具有相同的可绘制对象(例如聊天屏幕),则需要大量时间(仅超过 0.1 秒)在我的情况下加载所有可绘制对象)

我创建了一个关于此问题的问题:https://issuetracker.google.com/issues/193907127