Jetpack Compose - 缩放时图像抗锯齿不如原生 ImageView 平滑

时间:2021-03-25 20:40:22

标签: android-jetpack-compose

我正在重构屏幕以使用 jetpack compose。它有一个 ImageView 位于背景顶部,其中包含一个按比例缩小的 1920x795dp PNG 大图像(mdpi 和 hdpi 存储区)。更改为使用 Image 后,它现在具有明显锯齿状边缘。

ImageView

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:scaleType="fitXY"
    android:layout_marginBottom="-90dp"
    android:src="@drawable/ic_swoosh"/>

ImageView

ImageView

Image

Image(
    modifier = Modifier
        .fillMaxWidth()
        .offset(y = 90.dp)
        .align(Alignment.BottomCenter),
    painter = painterResource(R.drawable.ic_swoosh),
    contentDescription = null,
    contentScale = ContentScale.Fit,
)

Compose Image

Compose Image

深入到 Image 的源代码中,它使用了 AndroidPaint,据说已启用它:

internal fun makeNativePaint() =
    android.graphics.Paint(android.graphics.Paint.ANTI_ALIAS_FLAG)

如果我将 ImageView 包裹在 AndroidView 中,则问题不存在。我还可以验证它的位置和大小是否与 Image 版本完全相同,但已正确消除锯齿。

AndroidView(
    modifier = Modifier
        .fillMaxWidth()
        .offset(y = 90.dp)
        .align(Alignment.BottomCenter),
    factory = {
        ImageView(it).apply {
            scaleType = android.widget.ImageView.ScaleType.FIT_XY
            setImageResource(R.drawable.ic_swoosh)
        }
    }
)

如果我用 contentScale = ContentScale.None 删除缩放,图像也很平滑,所以它似乎是由于被缩小了。完全删除 contentScale 会出现同样的问题,因为图像会自动缩小以适应视图。

编辑:如果我删除 hdpi 变体,它也会变得平滑!

0 个答案:

没有答案