VectorDrawable在API 23上无法正确渲染

32

我正在尽可能地用VectorDrawables替换所有图标。但是我注意到其中有一些在API 23上无法正确渲染,颜色似乎会溢出。其中三个中的一个可以正常渲染。这是我创建的一个独立项目的截图:

enter image description here

在API 21上看起来完全正常:

enter image description here

这里是示例应用程序的源代码

我正在使用AppCompat 24.0.0,在ImageView上使用app:srcCompat,并设置了vectorDrawables.useSupportLibrary=true。我还尝试过将AppCompat版本设置为23.4.0,目标设备版本设置为23。但是,如果我删除appCompat并将minSdkVersion设置为21并使用本机矢量支持,则结果不会改变。IDE没有抱怨任何不受支持的内容。如何找出问题所在?这是平台错误吗?有什么解决方法吗?


1
尝试了一个API 24模拟器和运行Android N预览版4的Nexus 6。没有问题,运行良好。 - gitter
4
不。但我在Android缺陷跟踪器上报告了同样的错误。你可能想要收藏它。https://code.google.com/p/android/issues/detail?id=215262 - gitter
显然,修复已在支持库25中发布。不过我还没有测试过。 - gitter
我在使用api 23时遇到了同样的问题,但在24上没有。 同时,通过编程方式添加矢量图而不是在xml中默认添加它,似乎可以使渲染正常工作。 至少对我来说有效。 - Jota
@gitter 你找到这个问题的解决方案了吗?我已经跟随你提供的谷歌链接,但是没有找到解决方案。如果你找到了任何解决方案,请分享一下。 - Ali
显示剩余7条评论
3个回答

38

我在API 23上遇到了完全相同的问题。我是在代码中动态设置ImageView的源,而不是在xml中进行设置。后来我意识到问题出在我这么做:

Drawable show = getContext().getResources().getDrawable(resourceId);

当我本应该在做:

Drawable show = AppCompatResources.getDrawable(getContext(), resourceId);

我希望这能帮助到某个人!


3
这正是我做错的地方。感谢您的建议。 - Stefan Arn
5
这绝对是问题的原因,我有大约100个图标遇到了类似的渲染问题,通过改变这个问题全部得到了解决。谢谢!同时调用 ContextCompat.getDrawable 也不起作用。 - Nicolas
1
尝试了很多方法后,这个解决方案终于奏效了!非常感谢! - mapo
这确实解决了问题,但遗憾的是在XML中设置矢量图没有什么可以做的。 - galaxigirl

26

你知道这与在样式中定义的可绘制对象有什么关系吗? - Antek

22

首先声明,我不是Android开发人员,我是一名设计师,在Android Studio中协助制作一些生产资产。

我们开始遇到一些矢量可绘制对象在从22版本移植到24版本时出现了相同的问题。

(我将我的项目更新为使用Nexus 6 API 23和编译版本24、生成版本24、目标SDK 24。然后我的绘图对象似乎关闭了路径并添加了填充,类似于上面发生的情况。)

尝试的方法:

我可以使用Adobe Illustrator CC(19.2.1),并尝试在具有描边的对象上探索各种路径选项。包括扩展路径到填充、合并路径、制作复合路径、关闭路径等,但都没有成功。

转换器选项:

在线SVG到Drawable转换器 (http://inloop.github.io/svg2android/) 有一个选项 "Bake transforms into path (experimental)",我选择了它,虽然它改善了渲染效果,但仍然不完美。

潜在的解决方案:

然后我再次进入Illustrator,并尝试了"另存为"SVG和"导出"为SVG。我不确定Adobe Illustrator两个设置之间的区别,但它们确实输出了略微不同的SVG XML数据。

然后我将新的"Save As SVG"文件拖放到此在线Drawable转换器中:http://inloop.github.io/svg2android/

并勾选了以下选项:

  • 删除没有属性的空组
  • 将变换烘焙到路径中 (实验性功能)

返回的新Drawable XML似乎正常工作并正确呈现。

我不确定这是否适用于具有描边、形状和填充的其他矢量图形,但我想分享我的经验。这不是一个真正的解决方案,因为它似乎是新Android SDK中的一个错误,并且在之前已经支持过了,但对于一些人来说,这可能是一个可能的临时解决办法。


我可以确认这对我使用的Illustrator CC 20.1.0有效。这让我的一天变得美好了! - Pedro Loureiro
2
我确认即使不使用http://inloop.github.io/svg2android/,Illustrator的“另存为”可以生成良好的SVG文件,但“导出”则不能。 - Nicolas Massart
我可以确认,使用http://inloop.github.io/svg2android/对我有效。非常感谢!受影响的设备包括Android Studio模拟器和三星设备(即使在Marshmallow上也是如此)。 - Tiffany
该工具已被弃用,Android Studio在API 23中不能很好地呈现具有圆角的矢量图。 - galaxigirl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接