在Android 21上使用fillType="evenOdd"

19

我有一张SVG图片,想要将其包含在Android项目中。

该项目的minSdk版本为9。Android Studio正在生成SVG的PNG文件。

然而,对于API 21+,Android Studio将SVG包含在drawable-anydpi-v21资源文件夹中。

这意味着任何运行API 21及以上版本的设备都将使用SVG而不是PNG。

这就是问题所在:我的SVG需要android:fillType="evenOdd"属性。

PNG已经被正确生成,但对于SVG来说,因为该属性是API 24+的,它在API 21设备上被忽略了,图像出现了填充而不是线框状的图像。

有没有办法说服Android Studio只包含PNG并完全放弃SVG?

还有其他解决方法吗?


你尝试过将你的VectorDrawable移动到一个名为drawable-anydpi-v24的文件夹中吗? - Paul LeBeau
没有自动化的方法将依赖于evenOdd的文件转换为nonZero,因为这是一种视觉差异,工具不知道它应该看起来像什么。任何转换都必须在编辑器中手动完成。 - Paul LeBeau
@PaulLeBeau 这是个好主意,不过我担心 Android Studio 会将其解释为不生成任何内容,因为该资产仅适用于 24+。我会尝试一下看看它的表现如何。 - njzk2
有解决方案吗? - Mohamed ALOUANE
请问能否提供一个需要使用 evenOdd 的 SVG 样例,并且如果不使用它,会呈现不同的效果呢?我想这个问题在较新版本的 com.android.support:appcompat-v7 中已得到解决。 - android developer
我不再能访问那个文件了,但简而言之,evenOdd是关于填充如何应用的。基本上,该图像看起来像一个平坦的实心形状,而不是一个立体的线框结构。 - njzk2
5个回答

8

属性android:fillType仅适用于API级别为24及以上的版本。对于低于此API级别的版本,请按照以下步骤操作。

  1. add this to your Gradle file.

    //Gradle Plugin 2.0+
    android {
      defaultConfig {
         ...
         vectorDrawables.useSupportLibrary true
      }
    }
    
  2. If you are using ImageView, change its property android:src to app:srcCompat.

  3. If you are using as android:drawableStart or android:drawableEnd in TextView, change it to app:drawableStartCompat or app:drawableEndCompat.


7

解决方案1

Sketch中将图像平铺,然后使用此网站将SVG转换为Android的xml格式。

解决方案2

我使用了nonZero而不是evenOdd,并在Sketch中打开它以反转顺序。在反转后,它将更改pathData并删除android:fillType,在Android 21+上所有内容都正常工作。

解决方案3

PNG

简而言之

经过一些研究,我发现矢量图形、SVG的fill-rule属性有两种方法,“evenodd”和“nonzero”。

我在Sketch中打开SVG图标并检查图标顶部的孔。如预期所用,它使用fill-rule:evenodd属性。现在我必须更改fill-rule以使用“nonzero”属性。怎么做?选择路径。在右侧,有一个“填充”属性的设置图标。点击它并选择“非零”。

从主菜单中选择图层→路径→反转顺序。我把孔放回了图标的顶部,并在应用程序中得到了孔。

更多细节


你不必使用nonZero,因为它是默认值。在草图中反转它可以起作用,就像其他涉及修改原始SVG文件的解决方案一样,但这不是我想要的,因为我更愿意直接使用设计师发送的文件。 - njzk2
在 Sketch 中反转后,它将更改 pathData 并删除 android:fillType。 - UmAnusorn

3

现在使用 filltype="evenOdd" 的 SVG 在 Android gradle plugin 3.2 上可以正常工作并正确显示。您可能还需要使用 Support Library 28 或 AndroidX 1.0。

请确保在顶级 build.gradle 中至少使用此版本:

classpath 'com.android.tools.build:gradle:3.2.0'

1
你可以将SVG转换为XML文件,这将解决你的问题。这是将SVG转换为XML文件的链接svgToXML

谢谢。我正在使用包含在Android Studio中的Vector Asset Studio将SVG转换为XML。这个转换器有同样的问题:https://github.com/inloop/svg2android/issues/44,它给了我一个带有`android:fillType="evenOdd"`的XML。 - njzk2
有几个其他的网站可以将SVG转换为XML,你试过其中一些吗? - Ranjan
你是否以SVG格式上传了你的图像或链接,也许有人可以将其转换。 - Ranjan
我正在寻找一种更通用的解决方案,因为未来会有更多相同类型的图像。 - njzk2
6
这个链接是一个SVG转矢量Drawable的工具,对我来说效果更好。虽然它不支持批量转换,但有时结果与原始SVG有所不同,但使用这个工具还没有遇到过这种情况,与答案中提到的那个工具相反。 - Boy
SVG文件在Android Studio导入时会自动转换为XML格式。 - IgorGanapolsky

-1

将您的SVG文件在线转换,然后在生成的XML文件中删除android:fillType="evenOdd"。将XML文件复制并粘贴到res/drawable文件夹中。使用它。 希望这可以帮助您!


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