首页 > 解决方案 > 矢量绘图的奇怪问题。ImageView 中的锯齿状边缘

问题描述

我在同一布局中有两个 ImageView,一个的宽度和高度设置为 56dp,另一个设置为 64dp。我在项目中添加了一个矢量资产(我从 Android Studio 中选择了一个预定义的矢量资产)。我ImageView.setImageResource(int resId)在为两个 ImageView 设置相同的可绘制矢量时使用。

出于某种原因,这会导致最小的 ImageViews 具有锯齿状边缘。我将 Drawables 设置为 ImageViews 的顺序并不重要。哪个 ImageView 是最小的或它们有什么尺寸都没有关系。只要一个比另一个小,最小的总是有锯齿状的边缘。

compileSdkVersion 28
minSdkVersion 28

截屏

标签: javaandroid

解决方案


发生这种情况是因为Drawable从同一资源加载的实例共享一个ConstantState实例。我不确定到底是哪一部分ConstantState对此负责,但是您在功能上获得了两个不同的 64x64 可绘制对象,其中一个(严重)缩小了。

Drawable.mutate()您可以通过使用该方法来确保您的两个 ImageView 获取具有不同 ConstantState 的 Drawable来解决此问题。您只需要mutate()两个可绘制对象之一,您选择哪一个并不重要。

当然,这意味着您将不得不获取一个实际Drawable实例,而不是使用setImageResource().

ImageView large = findViewById(R.id.large);
large.setImageResource(R.drawable.ic_arrow_drop_down_circle_black_24dp);

ImageView small = findViewById(R.id.small);
small.setImageDrawable(AppCompatResources.getDrawable(this, R.drawable.ic_arrow_drop_down_circle_black_24dp).mutate());

推荐阅读