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

d-f*_*erx 13 android-drawable android-jetpack-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>
Run Code Online (Sandbox Code Playgroud)

我尝试使用下面的片段来加载形状

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)
            })
Run Code Online (Sandbox Code Playgroud)

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

Gab*_*tti 14

最好的解决方案是使用ShapeCompose 提供的。

就像是:

Box(
    modifier = Modifier
        .size(200.dp)
        .background(Color(0xFFFBCCBD), shape = RoundedCornerShape(16.dp))
)
Run Code Online (Sandbox Code Playgroud)

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

就像是:

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

在此输入图像描述


Dav*_*him 3

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

    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)
            })

Run Code Online (Sandbox Code Playgroud)

您将添加一个像这样的临时布局
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>
Run Code Online (Sandbox Code Playgroud)

  • 请不要真的这样做。除非您有非常充分的理由,否则 Jetpack Compose 还有很多其他选项,例如带有形状或直接在画布上绘图的“Surface”。使用 Compose 方式执行此操作,性能肯定会更好,而且开销也会少很多:) (4认同)