在Android 21上使用fillType ="evenOdd"

njz*_*zk2 11 svg android vector android-vectordrawable

我有一个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工作室只包含PNG并完全放弃SVG?

还有其他解决方案吗?

UmA*_*orn 7

解决方案1

\n\n

在Sketch中展平图像并使用此站点将 SVG 转换为适用于 Android 的 xml

\n\n

解决方案2

\n\n

我使用 nonZero 而不是 EvenOdd 并在 Sketch 中打开它以反转顺序,反转后它将更改 pathData 并删除 android:fillType,并且在 Android 21+ 上一切正常。

\n\n

解决方案3

\n\n

巴布亚新几内亚

\n\n

总长DR

\n\n

经过一番研究,我发现矢量图形、SVG 有两种填充规则属性方法,即 \xe2\x80\x9cevenodd\xe2\x80\x9d 与 \xe2\x80\x9cnonzero\xe2\x80\x9d

\n\n

我在 Sketch 中打开 SVG 图标并检查图标顶部的孔。正如预期的那样,它使用 fill-rule:evenodd 属性。现在我必须更改填充规则以使用 \xe2\x80\x9cnonzero\xe2\x80\x9d 属性。如何?选择路径。在右侧,\xe2\x80\x9cFills\xe2\x80\x9d 属性处有一个设置图标。单击它并选择 \xe2\x80\x9cnon-zero\xe2\x80\x9d。

\n\n

从主菜单中,选择图层 \xe2\x86\x92 路径 \xe2\x86\x92 逆序。我在图标顶部找到了这个洞,在应用程序中也找到了这个洞。

\n\n

了解更多详情

\n


小智 5

属性android:fillType仅用于 API 级别24及更高级别。对于低于 API 级别,请按照以下步骤操作。

  1. 将此添加到您的 Gradle 文件中。

    //Gradle Plugin 2.0+
    android {
      defaultConfig {
         ...
         vectorDrawables.useSupportLibrary true
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您使用的是ImageView,请将其属性更改android:srcapp:srcCompat

  3. 如果您使用 asandroid:drawableStartandroid:drawableEndin TextView,请将其更改为app:drawableStartCompatapp:drawableEndCompat


Ran*_*jan 1

您可以将 svg 转换为 xml 文件,这将解决您的问题,这是将 svg 转换为 xml 文件的链接svgToXML

  • http://a-student.github.io/SvgToVectorDrawableConverter.Web/ 这个对我来说效果更好。它不支持批处理,但有时结果与原始 SVG 不同。不过,与答案中提到的相反,该转换器还没有它 (6认同)