web-dev-qa-db-fra.com

VectorDrawable: dégradé de balise dessinable non valide

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>
6
Praveen Singh

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é 

4
HerberthObregon

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>
    ...
    ...
2
Elenasys

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.

1
Abhishek Bansal

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.

0

Essayez d’ajouter une commande de support vectoriel dans votre application, par exemple. 

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

 enter image description here

0
Android Geek