在Android Studio导入SVG文件时出现了“渐变没有停止信息”错误。

29

我正在尝试使用矢量资产在Android Studio中上传从Inkscape导出的SVG文件,但不幸的是,我得到了以下错误:

ERROR @line 35: Gradient has no stop info

定义渐变的代码:

<defs
     id="defs11210">
    <linearGradient
       inkscape:collect="always"
       id="linearGradient11815">
      <stop
         style="stop-color:#69aeed;stop-opacity:1"
         offset="0"
         id="stop11811" />
      <stop
         style="stop-color:#66e6b2;stop-opacity:0.90909094"
         offset="1"
         id="stop11813" />
       --&gt;
    </linearGradient>
    <radialGradient <!-- LINE 35-->
       inkscape:collect="always"
       xlink:href="#linearGradient11815"
       id="radialGradient928"
       cx="99.615288"
       cy="233.88142"
       fx="99.615288"
       fy="233.88142"
       r="80.842598"
       gradientTransform="matrix(1,0,0,1.3440437,0,-80.46542)"
       gradientUnits="userSpaceOnUse" />
  </defs>

我猜测xlink:href="#linearGradient11815"引起了问题,但我不明白为什么Android Studio无法识别停止信息在引用中。

提前致谢。

我按照Moini建议更改了语法,但仍然不起作用:

<stop stop-color="#69aeed"
        stop-opacity="1"
        offset="0" />
<stop stop-color="#66e6b2"
        stop-opacity="0.90909094"
        offset="1" />

我怀疑Android Studio期望使用这种语法而不是CSS样式渐变:https://developer.mozilla.org/en-US/docs/Web/SVG/Element/stop - Moini
我更新了stop-color的代码,但它仍然无法正常工作。你能否请看一下? - Paweł Bęza
抱歉,我其实不是这方面的专家,只能提供一些意见。我建议尝试替换xlink,同时也要检查第35行(或者现在可能是其他行)的内容。 - Moini
6个回答

25

正如我所怀疑的那样,问题出现在第xlink:href="#linearGradient11815"行。看起来Android Studio无法识别停止信息是在引用中的。因此,只需要按以下方式重写即可:

<defs
    id="defs11210">
    <radialGradient
       inkscape:collect="always"
       id="radialGradient11817"
       cx="29.611446"
       cy="168.14627"
       fx="29.611446"
       fy="168.14627"
       r="80.8426"
       gradientTransform="matrix(1.6670816,2.4672037,-1.1136432,0.75249749,172.27529,-58.475252)"
       gradientUnits="userSpaceOnUse">
       <stop
          style="stop-color:#69aeed;stop-opacity:1"
          offset="0"
          id="stop11811" />
       <stop
          style="stop-color:#66e6b2;stop-opacity:0.90909094"
          offset="1"
          id="stop11813" />
    </radialGradient>
  </defs>

基本上,停止标签应嵌套在radialGradient或linearGradient内。

您还可以使用Java工具github.com/14v/svg-non-stop。首先需要在计算机中下载和安装JDK,然后使用命令行运行该工具。

Linux或Mac可以使用终端。

> cd /folder/to/svg-non-stop 
> ./svg-non-stop /my/full/path/to/your.svg

然后将输出另一个符合要求格式的svg文件,然后您可以将其导入到Android Studio的Asset Vector中。


优秀的推理,伙计。 - Jacob Sánchez
1
@Serge 如何使用以及在哪里使用它? - Jetwiz
@Jetwiz 前往 Github 页面,点击二进制文件的链接,进行下载并解压缩。打开终端窗口并导航至 svg-non-stop-1.x.x 目录。然后按照 Github 页面上的说明使用以下命令:./bin/svg-non-stop /full/path/to/my_vector_drawable.svg。我只在 Linux 机器上测试过,但对我来说它非常完美地工作,并生成了一个修复后的新 svg 文件! - Geoff Davids
9
https://github.com/14v/svg-non-stop自动化了这个算法。 - MainActivity

4

xlink:href 属性已被MDN Web Docs弃用。 因此,我猜它已不再被Android Studio识别。

我个人导入的svg资产是通过Adobe Illustrator中的文件菜单->导出->另存为...->SVG 导出的。从Illustrator导出的文件使用了这个属性,引起了问题。

要解决这个问题,只需将一个 xlink:href 引用到的缺失属性和子元素全部复制到调用者元素中。

我的SVG文件中原始片段如下:

<linearGradient id="linear-gradient-23" x1="643.82" y1="401.79" x2="178.79" y2="-321.38" gradientUnits="userSpaceOnUse">
  <stop offset="0" stop-color="#fff" stop-opacity="0"/>
  <stop offset="0.98"/>
</linearGradient>
<linearGradient id="linear-gradient-24" x1="391.43" y1="437.67" x2="459.26" y2="298.96" xlink:href="#linear-gradient-23"/>
<linearGradient id="linear-gradient-25" x1="608.57" y1="440.97" x2="515.57" y2="257.5" xlink:href="#linear-gradient-23"/>
<linearGradient id="linear-gradient-26" x1="512" y1="551.86" x2="512" y2="-28.38" xlink:href="#linear-gradient-23"/>
<linearGradient id="linear-gradient-27" x1="381.42" y1="391.4" x2="478.72" y2="193.35" xlink:href="#linear-gradient-23"/>

我将属性gradientUnits="userSpaceOnUse"和子元素 <stop .. />"linear-gradient-23"复制到每个引用它的元素中:
<linearGradient id="linear-gradient-23" x1="643.82" y1="401.79" x2="178.79" y2="-321.38" gradientUnits="userSpaceOnUse">
  <stop offset="0" stop-color="#fff" stop-opacity="0"/>
  <stop offset="0.98"/>
</linearGradient>
<linearGradient id="linear-gradient-24" x1="391.43" y1="437.67" x2="459.26" y2="298.96" gradientUnits="userSpaceOnUse" xlink:href="#linear-gradient-23">
  <stop offset="0" stop-color="#fff" stop-opacity="0"/>
  <stop offset="0.98"/>
</linearGradient>
<linearGradient id="linear-gradient-25" x1="608.57" y1="440.97" x2="515.57" y2="257.5" gradientUnits="userSpaceOnUse" xlink:href="#linear-gradient-23">
  <stop offset="0" stop-color="#fff" stop-opacity="0"/>
  <stop offset="0.98"/>
</linearGradient>
<linearGradient id="linear-gradient-26" x1="512" y1="551.86" x2="512" y2="-28.38" gradientUnits="userSpaceOnUse" xlink:href="#linear-gradient-23">
  <stop offset="0" stop-color="#fff" stop-opacity="0"/>
  <stop offset="0.98"/>
</linearGradient>
<linearGradient id="linear-gradient-27" x1="381.42" y1="391.4" x2="478.72" y2="193.35" gradientUnits="userSpaceOnUse" xlink:href="#linear-gradient-23">
  <stop offset="0" stop-color="#fff" stop-opacity="0"/>
  <stop offset="0.98"/>
</linearGradient>

我建议使用现代化的文本编辑器,比如VSCode来完成这项任务。如果有人知道如何在Illustrator中导出资源而不会引起问题,请随意留言!


更新:如@mainactivity所述,GitHub上有一个自动化脚本用于此转换工作github.com/14v/svg-non-stop


你解决了这个问题吗? - Ricky Levi
@rickey-levi 如果你的意思是如何从Illustrator中导出完美的SVG,那么不行。 - Homan

4

3

它帮助我在Inkscape中将SVG另存为文件 > 另存为.. > 另存为类型:优化的SVG(*.svg)

我的SVG非常简单,所以可能并不适用于所有人。


2
在我的情况下,我找到了为什么会发生这种情况的原因。 我有两个形状具有相同的渐变颜色 例如:从白色到蓝色 在svg中,它只定义了这个渐变一次,而另一个没有。这导致第二个形状没有声明“stop”语句来填充。
=> 要解决这个问题,只需将第二个形状更改为略微不同的颜色(我将RGB增加了一个整数)。

0
我遇到了同样的问题,但是我没有手动编辑XML文件,而是通过这个工具处理它: https://www.svgminify.com/

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