java - 矢量绘图的奇怪问题。ImageView 中的锯齿状边缘
问题描述
我在同一布局中有两个 ImageView,一个的宽度和高度设置为 56dp,另一个设置为 64dp。我在项目中添加了一个矢量资产(我从 Android Studio 中选择了一个预定义的矢量资产)。我ImageView.setImageResource(int resId)
在为两个 ImageView 设置相同的可绘制矢量时使用。
出于某种原因,这会导致最小的 ImageViews 具有锯齿状边缘。我将 Drawables 设置为 ImageViews 的顺序并不重要。哪个 ImageView 是最小的或它们有什么尺寸都没有关系。只要一个比另一个小,最小的总是有锯齿状的边缘。
compileSdkVersion 28
minSdkVersion 28
解决方案
发生这种情况是因为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());
推荐阅读
- c# - 如何捕获从 ASP.NET Core Web API 发送的自定义错误消息(在 ASP.NET Core Web 客户端中)
- go - 同时将来自流的字节发送到两个目的地
- javascript - 无法根据下拉列表选择禁用文本输入
- javascript - 如何从给定的字符串中排除某些字符?
- sql-server - SQL Server Sum 返回无效数字
- c# - .NET 核心应用部署到本地 IIS,500.19
- python - 请求对象在 DRF + DOT 中没有属性“oauth2_error”
- python - AttributeError:“列表”对象没有属性“拆分”vcf
- python - 如果它们出现在一年而不是下一年并再次出现,我如何将相似的名称与给定的行匹配?
- aws-lambda - 如何下载 AWS Lambda 层