我正在重构屏幕以使用 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"/>
Image
:
Image(
modifier = Modifier
.fillMaxWidth()
.offset(y = 90.dp)
.align(Alignment.BottomCenter),
painter = painterResource(R.drawable.ic_swoosh),
contentDescription = null,
contentScale = ContentScale.Fit,
)
深入到 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 变体,它也会变得平滑!