如何在合成图像中加载可绘制的形状

时间:2021-02-27 12:59:49

标签: android-drawable android-jetpack-compose

我想在 compose 中为图像设置一个可绘制的形状,可绘制看起来像这样 curved_rect.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
    
        <solid android:color="#FBCCBD" />
        <corners android:radius="8dp" />
</shape>

我尝试使用下面的 snipet 加载形状

Image(painter = painterResource(id = R.drawable.cureved_rect),
        contentDescription = null,
        modifier =  Modifier
            .padding(32.dp)
            .fillMaxWidth()
            .height(200.dp)
            .constrainAs(image) {
                top.linkTo(parent.top)
                start.linkTo(parent.start)
                end.linkTo(parent.end)
            })

但它不起作用,应用程序崩溃并出现异常java.lang.IllegalArgumentException:仅支持 VectorDrawables 和光栅化资产类型,例如 PNG、JPG 1 .如何在撰写中加载可绘制的形状 2 .加载合成图像中的颜色资源

2 个答案:

答案 0 :(得分:2)

最好的解决方案是使用 Compose 提供的 Shape
类似的东西:

Box(
    modifier = Modifier.size(200.dp)
        .background(Color(0xFFFBCCBD), shape = RoundedCornerShape(16.dp))
)

否则,如果您想使用可绘制资源,您可以使用 coil-compose 版本:

类似于:

Image(
    rememberImagePainter( ContextCompat.getDrawable(context,R.drawable.shape)),
    contentDescription = "Background",
    modifier = Modifier.size(200.dp) 
)

enter image description here

答案 1 :(得分:1)

这是一种解决方法,而不是使用 Image 可组合函数, 您可以使用 AndroidView,因此您的代码将类似于:

    AndroidView(factory = {
        val view = LayoutInflater.from(it).inflate(R.layout.temp_layout, null, false)
        view 
                          }, 
        modifier = Modifier
            .padding(32.dp)
            .fillMaxWidth()
            .height(200.dp)
            .constrainAs(image) {
                top.linkTo(parent.top)
                start.linkTo(parent.start)
                end.linkTo(parent.end)
            })

您将添加这样的临时布局
temp_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="@drawable/cureved_rect"
    android:layout_height="match_parent">

</ImageView>