J'utilise Android Asset Studio pour générer des dessins vectoriels à partir de fichiers SVG exportés depuis Zeplin depuis un moment et, sauf quelques fois, cela fonctionne bien. Mais aujourd’hui, j’ai eu cette exception lorsque j’essayais d’utiliser un vecteur généré dessinable.
Android.view.InflateException: Binary XML file line #0: Error inflating class <unknown>
Et dans le même stacktrace:
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #0: invalid drawable tag gradient
Je ne connais pas beaucoup de Vector drawables et de SVG dans Android. Les dégradés ne sont-ils pas pris en charge dans Vector? Existe-t-il une solution à ce problème ou dois-je utiliser des fichiers PNG?
J'utilise la version de la bibliothèque de support:
com.Android.support:support-v4:26.1.0
J'utilise
Android Studio 3.0
Voici le fichier VectorDrawable généré par 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>
Lien vers le fichier SVG d'origine: https://drive.google.com/file/d/1Lj62xJv5IpYR5Lle7w1kMsFXh6y5PijK/view?usp=sharing
Contenu SVG à l'ouverture de 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>
Android: fillColor avec dégradé uniquement prend en charge l’API 24+ (7.0)
ref: https://developer.Android.com/reference/Android/graphics/drawable/VectorDrawable.html
essayez d'ajouter 'drawable-v24' et le même vecteur dans le dossier 'drawable' sans dégradé
La propriété Android: fillColor est uniquement prise en charge sous OS 7.0+,
Android: fillColor Spécifie la couleur utilisée pour remplir le chemin. Peut être une couleur Ou, pour le SDK 24+, une liste d'états de couleurs ou une couleur de dégradé (voir GradientColor et GradientColorItem). Si cette propriété est animée, Toute valeur définie par l'animation remplacera la valeur d'origine. Aucun remplissage de chemin d'accès N'est tracé si cette propriété n'est pas spécifiée.
pour les anciennes versions du répertoire/drawable , nous pouvons placer la ressource vectorielle sans les gradients, par exemple:
<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>
...
...
et à l'intérieur de/drawable-24 répertoire avec 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>
...
...
Cette solution fonctionne pour nous In build.gradle
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
et utilisez app:srcCompat
au lieu de Android:src
lorsque vous définissez un vecteur dessinable avec un dégradé sur ImageView
.
Les balises dégradées en SVG sont prises en charge à partir de la version 7 du système d'exploitation. Essayez de commenter la balise de dégradé pour les versions sous OS version 7.