【问题标题】:Use fillType="evenOdd" on Android 21在 Android 21 上使用 fillType="evenOdd"
【发布时间】:2017-05-02 12:27:02
【问题描述】:

我有一个 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 的文件夹中?
  • 没有自动方法将依赖于 evenOdd 的文件转换为 nonZero,因为这是视觉上的差异,并且工具不知道它应该是什么样子。任何转换都必须在编辑器中手动完成。
  • @PaulLeBeau 这是个好主意,尽管我担心 android studio 会将其解释为不生成任何东西,因为该资产仅 24+。我会试试看它的作用。
  • 这个有什么解决办法吗?
  • 您能否展示一个需要 evenOdd 的示例 SVG,如果没有它,它看起来会有所不同吗?我认为它在com.android.support:appcompat-v7的更高版本中得到了修复

标签: android svg vector android-vectordrawable


【解决方案1】:

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

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

    //Gradle Plugin 2.0+
    android {
      defaultConfig {
         ...
         vectorDrawables.useSupportLibrary true
      }
    }
    
  2. 如果您使用的是ImageView,请将其属性android:src 更改为app:srcCompat

  3. 如果您在TextView 中使用android:drawableStartandroid:drawableEnd,请将其更改为app:drawableStartCompatapp:drawableEndCompat

【讨论】:

    【解决方案2】:

    解决方案 1

    Sketch 中扁平化图像并使用this site 将SVG 转换为Android 的xml

    解决方案 2

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

    解决方案 3

    PNG

    TLDR

    经过一番研究,我发现矢量图形、SVG 有两种填充规则属性方法,“偶数”与“非零”

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

    从主菜单中,选择图层 → 路径 → 逆序。我把图标顶部的洞弄回来了,应用程序也弄了洞。

    For more detail

    【讨论】:

    • 你不必使用非零,这是默认值。在草图作品中反转它,就像其他涉及修改原始 SVG 文件的解决方案一样,这不是我想要的,因为我宁愿能够直接使用设计师发送的文件。
    • 在 Sketch 中反转后会改变 pathData 并移除 android:fillType
    【解决方案3】:

    带有 filltype="evenOdd" 的 SVG 现在似乎可以在 Android gradle 插件 3.2 中正常工作和显示。您可能还需要使用支持库 28 或 AndroidX 1.0。

    确保它在您的顶级 build.gradle 中至少是这个版本:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 谢谢。我正在使用 Android Studio 中包含的 Vector Asset Studio 将 SVG 转换为 XML。这个转换器有同样的问题:github.com/inloop/svg2android/issues/44 它给了我一个带有android:fillType="evenOdd"的XML
      • 还有其他几个可以将svg转换为xml的网站,你有没有试过。
      • 您上传的图片或链接是否为svg格式,也许任何人都可以转换。
      • 我正在寻找一个更通用的解决方案,因为将来会有更多相同类型的图像
      • a-student.github.io/SvgToVectorDrawableConverter.Web 这个对我来说效果更好。它不支持批处理,但有时结果与原始 SVG 不同。不过,这个转换器还没有,与答案中提到的相反
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        相关资源
        最近更新 更多