Jetpack Compose 显示像素化的缩放图像

问题描述 投票:0回答:2

我正在从 XML 布局迁移到 Jetpack Compose,并注意到图像可组合项在图像被裁剪时无法像

ImageView
那样缩放图像。

Top image is from Jetpack Compose, bottom image is an ImageView

顶部的图像是通过 Jetpack Compose 添加的,底部的图像是

ImageView
。 为了进行比较,我将它们并排添加,如下所示:

Column {
    Image(
        painter = painterResource(id = R.drawable.my_image),
        contentDescription = null,
        contentScale = ContentScale.Crop,
        modifier = Modifier.size(280.dp)
    )
    Spacer(
        modifier = Modifier.height(4.dp)
    )
    AndroidView(
        factory = { context ->
            ImageView(context).apply {
                scaleType = ImageView.ScaleType.CENTER_CROP
                setImageResource(R.drawable.my_image)
            }
        },
        modifier = Modifier.size(280.dp)
    )
}

效果取决于所使用的图像,我注意到它主要在低端设备上突出,但是我希望 Jetpack Compose 具有相同或更高的图像质量,因为它是在 Android 上构建 UI 的新框架。

有什么我缺少的东西可以给我与

ImageView
相同的质量吗?

android android-imageview android-jetpack-compose
2个回答
0
投票

如果你有一个矢量图像,你应该使用ImageVector.vectorResource而不是painterResource

Icon(
        imageVector = ImageVector.vectorResource(id = R.drawable.vectorId),
        contentDescription = "bar action image",
        tint = if (!uiData.enabled) LightSteelBlue else uiData.iconTint,
        modifier = Modifier.size(iconScaleDefault)
    )

因为,当您使用光栅图像时,重新缩放可能会像素化。 另请参阅https://developer.android.com/jetpack/compose/graphics/images/compare


0
投票

我对非常简单的形状也有同样的问题。对我来说,问题是我将

Modifier.scale(3f)
ContentScale.Crop
结合使用。

这样做解决了它:

Image(
    modifier = Modifier
        .align(Alignment.Center)
        .wrapContentSize(unbounded = true),
    painter = painterResource(id = R.drawable.ic_vector),
    contentScale = FixedScale(3f),
    contentDescription = null
)

我不确定比例修改器在这里起什么作用,以及使用

Modifier.size()
时会发生什么变化,但你可以尝试这个:

Image(
    painter = painterResource(id = R.drawable.my_image),
    contentDescription = null,
    contentScale = FixedScale(1f),
    modifier = Modifier.size(280.dp)
)
© www.soinside.com 2019 - 2024. All rights reserved.