I have been using the Android Asset Studio to generate vector drawables from SVG files exported from Zeplin for a while and except a few times, it works fine. But today I got this exception when I was trying to use a generated vector drawable.
android.view.InflateException: Binary XML file line #0: Error inflating class <unknown>
And in the same stacktrace:
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #0: invalid drawable tag gradient
I do not know a lot about Vector drawables and SVGs in Android. Are gradients not supported in Vector drawables? Is there any fix for this issue or do I need to use PNGs?
I am using Support Library version:
com.android.support:support-v4:26.1.0
I am using
Android Studio 3.0
Here is the VectorDrawable file generated by Android Asset Studio:
<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>
Link to original SVG file: https://drive.google.com/file/d/1Lj62xJv5IpYR5Lle7w1kMsFXh6y5PijK/view?usp=sharing
SVG contents when opened on Sublime:
<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>
This solution is working for us
in build.gradle
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
and use app:srcCompat
instead of android:src
when setting a vector drawable with gradient to a ImageView
.
The property android:fillColor is only supported in OS 7.0+ ,
android:fillColor Specifies the color used to fill the path. May be a color or, for SDK 24+, a color state list or a gradient color (See GradientColor and GradientColorItem). If this property is animated, any value set by the animation will override the original value. No path fill is drawn if this property is not specified.
for older versions in directory /drawable we can place the vector asset without the gradients, for example:
<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>
...
...
and inside /drawable-24 directory with gradients:
<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>
...
...
android:fillColor with gradient only is support for API 24+ (7.0)
ref: https://developer.android.com/reference/android/graphics/drawable/VectorDrawable.html
try add in 'drawable-v24' and the same vector in 'drawable' folder without gradient
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With