我一直在使用Android Asset Studio从Zeplin导出的SVG文件生成矢量drawable一段时间,除了几次,它工作正常。但是今天我尝试使用生成的矢量drawable时遇到了这个异常。
android.view.InflateException: Binary XML file line #0: Error inflating class <unknown>
在同一个堆栈跟踪中:
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #0: invalid drawable tag gradient
我对Android中的矢量绘图和SVG了解不多。 Vector drawables中是否不支持渐变?是否有解决此问题的方法,还是需要使用PNG?
我正在使用支持库版本:
com.android.support:support-v4:26.1.0
我正在使用
Android Studio 3.0
以下是Android Asset Studio生成的VectorDrawable文件:
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="360dp"
android:height="110dp"
android:viewportWidth="360.0"
android:viewportHeight="110.0">
<path
android:pathData="M82,46H0v64h360V46h-81.88v-0.3h-26.21c-14.25,0 -38.69,-6.2 -46.95,-25.93C200.99,10.25 193.27,0.52 180,0.47c-13.27,-0.05 -20.04,9.24 -24.75,19.3 -8.22,17.55 -24.66,26.19 -49.34,25.93H82V46z"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:startY="0.41999998688697815"
android:startX="0.0"
android:endY="110.0"
android:type="linear"
android:endX="360.0">
<item android:offset="0.0" android:color="#FFCB09FF" />
<item android:offset="1.0" android:color="#FF8A06FF" />
</gradient>
</aapt:attr></path>
</vector>
链接到原始SVG文件:https://drive.google.com/file/d/1Lj62xJv5IpYR5Lle7w1kMsFXh6y5PijK/view?usp=sharing
在Sublime上打开时的SVG内容:
<svg xmlns="http://www.w3.org/2000/svg" width="360" height="110" viewBox="0 0 360 110">
<defs>
<linearGradient id="a" x1="0%" y1="0%" y2="100%">
<stop offset="0%" stop-color="#CB09FF"/>
<stop offset="100%" stop-color="#8A06FF"/>
</linearGradient>
</defs>
<path fill="url(#a)" fill-rule="evenodd" d="M82 46H0v64h360V46h-81.876v-.299h-26.208c-14.25 0-38.69-6.198-46.946-25.93C200.99 10.252 193.27.52 180 .474c-13.27-.047-20.04 9.238-24.75 19.295-8.217 17.55-24.662 26.194-49.336 25.931H82V46z"/>
</svg>
答案 0 :(得分:7)
android:fillColor with gradient only仅支持API 24+(7.0)
REF: https://developer.android.com/reference/android/graphics/drawable/VectorDrawable.html
尝试添加&#39; drawable-v24&#39;和可绘制的相同的矢量&#39;没有渐变的文件夹
答案 1 :(得分:5)
仅在OS 7.0 +,
中支持属性android:fillColorandroid:fillColor指定用于填充路径的颜色。可能是一个 颜色或,对于SDK 24+,颜色状态列表或渐变颜色(参见 GradientColor和GradientColorItem)。如果此属性是动画的, 动画设置的任何值都将覆盖原始值。没有 如果未指定此属性,则绘制路径填充。
对于目录 / drawable 中的旧版本,我们可以放置不带渐变的矢量资源,例如:
<vector android:height="24dp" android:viewportHeight="651.95"
android:viewportWidth="531.48" android:width="24dp"
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:pathData="M386.8,30.2c-48.5,0 -76.1,18 -121.1,18s-72.6,-18 -121.1,-18c-87.9,0 -144.7,83.3 -144.7,186 0,92.9 160,350.5 265.7,350.5 112.9,0 265.7,-257.6 265.7,-350.5C531.5,113.5 474.7,30.2 386.8,30.2Z">
<!--<aapt:attr name="android:fillColor">
<gradient android:endX="212457.73219299316"
android:endY="440836.2612554932"
android:startX="212457.73219299316"
android:startY="92857.94223999024" android:type="linear">
<item android:color="#FFFC3A11" android:offset="0.0"/>
<item android:color="#FFDA0300" android:offset="1.0"/>
</gradient>
</aapt:attr>-->
</path>
...
...
和 / drawable-24 目录内的渐变:
<vector android:height="24dp" android:viewportHeight="651.95"
android:viewportWidth="531.48" android:width="24dp"
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:pathData="M386.8,30.2c-48.5,0 -76.1,18 -121.1,18s-72.6,-18 -121.1,-18c-87.9,0 -144.7,83.3 -144.7,186 0,92.9 160,350.5 265.7,350.5 112.9,0 265.7,-257.6 265.7,-350.5C531.5,113.5 474.7,30.2 386.8,30.2Z">
<aapt:attr name="android:fillColor">
<gradient android:endX="212457.73219299316"
android:endY="440836.2612554932"
android:startX="212457.73219299316"
android:startY="92857.94223999024" android:type="linear">
<item android:color="#FFFC3A11" android:offset="0.0"/>
<item android:color="#FFDA0300" android:offset="1.0"/>
</gradient>
</aapt:attr>
</path>
...
...
答案 2 :(得分:2)
由android:fillColor属性引起的错误;这是因为:
android:fillColor指定用于填充路径的颜色。可以是颜色,或者对于SDK 24+,可以是颜色状态列表或渐变颜色(请参阅GradientColor和GradientColorItem)。如果将此属性设置为动画,则动画设置的任何值都将覆盖原始值。如果未指定此属性,则不会绘制路径填充。
如果要在24之前的版本中使用渐变,可以使用解决方法:
-编辑矢量(例如,称为drawable / ic_vector.xml):
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="360dp"
android:height="110dp"
android:viewportWidth="360.0"
android:viewportHeight="110.0">
<path
android:pathData="M82,46H0v64h360V46h-81.88v-0.3h-26.21c-14.25,0 -38.69,-6.2 -46.95,-25.93C200.99,10.25 193.27,0.52 180,0.47c-13.27,-0.05 -20.04,9.24 -24.75,19.3 -8.22,17.55 -24.66,26.19 -49.34,25.93H82V46z"
android:fillType="evenOdd">
<!--<aapt:attr name="android:fillColor">
<gradient
android:startY="0.41999998688697815"
android:startX="0.0"
android:endY="110.0"
android:type="linear"
android:endX="360.0">
<item android:offset="0.0" android:color="#FFCB09FF" />
<item android:offset="1.0" android:color="#FF8A06FF" />
</gradient>
</aapt:attr></path>-->
-创建另一个可绘制资源,在其中插入渐变作为项:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<gradient
android:type="linear"
android:startColor="#FFCB09FF"
android:endColor="#FF8A06FF"
android:angle="270">
</gradient>
</shape>
</item>
<item android:drawable="@drawable/ic_vector"/>
希望我为您提供帮助!
答案 3 :(得分:1)
此解决方案对我们有效
在build.gradle
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
,在将可绘制渐变的矢量设置为app:srcCompat
时,使用android:src
代替ImageView
。
答案 4 :(得分:0)
答案 5 :(得分:0)
我能够通过使用
解决此问题app:srcCompat="@drawable/ic_vector"
代替
android:src="@drawable/ic_vector"
这已在API 22设备上进行了测试
答案 6 :(得分:0)
我的解决方案是不同的,我会在这里补充,希望对其他人有帮助。
我使用的是带有渐变的向量,这里是一个示例:
<path android:pathData="M69.12,78.34">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="69.12"
android:centerY="78.34002"
android:gradientRadius="0"
android:type="radial">
<item
android:color="#FFFFF176"
android:offset="0.41" />
<item
android:color="#FFFFC400"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
请注意 android:gradientRadius="0"
,问题是,可能某些 android 版本将其读取为 null
并因问题的错误而崩溃。
我的解决方法是更改为 android:gradientRadius="0.1"
或任何其他小数字。