矢量drawables的奇怪问题。 ImageView中的锯齿状边缘

时间:2019-05-15 14:52:33

标签: java android

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

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

compileSdkVersion 28
minSdkVersion 28

Screenshot

1 个答案:

答案 0 :(得分:0)

之所以会发生这种情况,是因为从同一资源加载的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());