在 Android Studio 中导入 SVG 文件时渐变没有停止信息错误
Gradient has no stop info error while importing SVG file in Android Studio
我正在尝试使用 Vector Asset
在 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" />
-->
</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" />
因为我怀疑问题出在 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。
就我而言,我弄清楚了为什么会发生这种情况。
我有 2 个具有相同渐变颜色的形状
例如:白色到蓝色
在 svg 中,它只定义了一次这个渐变,而另一次则没有。这导致没有声明“停止”语句来填充第二个形状
=> 要解决此问题,只需将第二个形状更改为稍微不同的颜色(我将 RGB 增加了一个整数)
主要原因是属性 xlink:href
已弃用
MDN Web Docs。
因此我猜它不再被 Android Studio 识别。
我个人导入了一个 svg 资产,它是通过文件 -> 导出 -> 导出为... -> SVG 从 Adobe Illustrator 导出的。从 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
我 运行 遇到了同样的问题,但我没有手动编辑 XML 文件,而是 运行 通过这个:
https://www.svgminify.com/
这个网站刚刚救了我:https://svg2vector.com/
导入您的 .svg 并生成 xml 代码
它帮助我 re-save Inkscape 中的 SVG 文件 > 另存为.. > 另存为类型:优化的 SVG (*.svg).
我的 SVG 非常简单,所以可能不适合所有人。
我正在尝试使用 Vector Asset
在 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" />
-->
</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" />
因为我怀疑问题出在 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。
就我而言,我弄清楚了为什么会发生这种情况。 我有 2 个具有相同渐变颜色的形状 例如:白色到蓝色 在 svg 中,它只定义了一次这个渐变,而另一次则没有。这导致没有声明“停止”语句来填充第二个形状
=> 要解决此问题,只需将第二个形状更改为稍微不同的颜色(我将 RGB 增加了一个整数)
主要原因是属性 xlink:href
已弃用
MDN Web Docs。
因此我猜它不再被 Android Studio 识别。
我个人导入了一个 svg 资产,它是通过文件 -> 导出 -> 导出为... -> SVG 从 Adobe Illustrator 导出的。从 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
我 运行 遇到了同样的问题,但我没有手动编辑 XML 文件,而是 运行 通过这个: https://www.svgminify.com/
这个网站刚刚救了我:https://svg2vector.com/ 导入您的 .svg 并生成 xml 代码
它帮助我 re-save Inkscape 中的 SVG 文件 > 另存为.. > 另存为类型:优化的 SVG (*.svg).
我的 SVG 非常简单,所以可能不适合所有人。