VectorDrawable - est-il disponible d'une manière ou d'une autre pour les versions pré-Lollipop d'Android? [fermé]

87

Contexte

J'ai remarqué qu'Android prend désormais en charge une sorte de dessin vectoriel, via une classe appelée " VectorDrawable " (et également AnimatedVectorDrawable , BTW). Je l'ai trouvé en regardant les nouveautés sur Android-Studio .

Je me demande si ce serait la fin d'avoir à mettre plusieurs fichiers dans plusieurs dossiers ( mdpi, hdpi, xhdpi, etc.). Ce serait génial et pourrait réduire la taille des applications dans certains cas.

Questions

J'aimerais poser quelques questions concernant cette nouvelle classe:

  1. Est-il possible de l'utiliser dans les anciennes versions d'Android, peut-être via une bibliothèque de même la bibliothèque de support de Google?

  2. Je ne sais pas comment cela fonctionne, mais Lollipop peut-il gérer les fichiers SVG? Peut-il faire tout ce qui est réalisable sur les fichiers SVG?

  3. Existe-t-il un exemple / tutoriel / vidéo de son utilisation, autre que la documentation que j'ai trouvée?

développeur android
la source
3
Autant que je sache , VectorDrawable est l' androïdification des fichiers SVG. J'utilise cependant des SVG depuis plus d'un an grâce à l'utilisation de bibliothèques tierces . ( android-svg , svg-android et autres). Il y en a qui portent le même nom. Chacun diffère des autres, alors choisissez avec précision en fonction de vos besoins.
Phantômaxx
7
J'ai créé un outil en ligne pour convertir SVG en vecteur de ressources xml (lollipop uniquement) - inloop.github.io/svg2android - Il n'a pas encore été testé tellement au début de l'alpha. Il supporte les fichiers svg simples (comme le support Android), je l'ai testé avec inkscape - dessiné des formes (rect, cercle, spirale ...), sélectionnez tout puis "Chemin-> Objet vers chemin", exporté vers * .svg et déposé sur le site, généré xml et fonctionne très bien.
Yuraj du
1
@Yuraj Wow, c'est trop cool! bon travail ! Et en si peu de temps ... Tiens, prends mon +1. :)
développeur android
Concernant inloop.github.io/svg2android ... Il a s a very usefull tool but Iobtenu un résultat incorrect dans un tel cas et je ne sais pas ce qui ne va pas ... Hmmm, pour une version ultérieure, je souhaite que cet outil notifie le mauvais format ... Si je utilisé des fichiers svg purs avec des
bibliothèques
@AlexZezekalo Vous devriez écrire à ce sujet sur sa page Web Github: github.com/inloop/svg2android
développeur Android

Réponses:

39

MISE À JOUR MARS 2016

Par la mise à jour 23.2.1 de la bibliothèque de support Android , prend en charge les dessins vectoriels et les dessins vectoriels animés. (vous pouvez également utiliser latestone pour le même)

Veuillez mettre à jour la version d'une bibliothèque dans le fichier gradle.

compile 'com.android.support:recyclerview-v7:23.2.1'

Les dessins vectoriels vous permettent de remplacer plusieurs éléments png par un seul graphique vectoriel , défini en XML. Alors que précédemment limité à Lollipop et des dispositifs plus élevés , à la fois VectorDrawableet AnimatedVectorDrawablesont maintenant disponibles grâce à deux nouvelles bibliothèques de soutien soutien-vecteur thermoformable et vecteur-drawable animé. nouvel app:srcCompatattribut pour référencer les dessins vectoriels.

Vérifiez la source sur github avec quelques exemples d'exemples .

Modifications de la bibliothèque appcompat v7:

Dépendance rétablie sur les ressources vectorielles afin que les développeurs utilisant la bibliothèque appcompat ne soient pas obligés d'utiliser VectorDrawableet ses indicateurs de construction associés.

Amit Vaghela
la source
3
A propos de la prise en charge des vecteurs, n'est-il pas suffisant de mettre à jour le plugin gradle et d'utiliser "vectorDrawables.useSupportLibrary = true" dans "defaultConfig"?
développeur android
1
oui, pour Gradle Plugin 2.0+ et Gradle Plugin 1.5, vous devez ajouter -> android {defaultConfig {generatedDensities = []} // Ceci est géré pour vous par le plugin Gradle 2.0+ aaptOptions {additionalParameters "--no-version -vectors "}}
Amit Vaghela
1
Veuillez également afficher du code ici. Un lien pourrait être mort un jour. Vous obtiendrez +1 pour cet effort :)
développeur android
Oui bien sûr. publiera du code en peu de temps sur git et ici.
Amit Vaghela
2
La compiledéclaration ci-dessus implique que le projet utilise RecyclerViewce qui n'est pas toujours le cas.
razzledazzle
13

Mise à jour 2 : ils l'activent à nouveau dans la bibliothèque de support 23.4.0:

Pour les utilisateurs d'AppCompat, nous avons ajouté une API opt-in pour réactiver la prise en charge de Vector Drawables à partir des ressources (le comportement trouvé dans 23.2) via AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) - gardez à l'esprit que cela peut toujours causer des problèmes d'utilisation de la mémoire et problèmes de mise à jour des instances de configuration, d'où la raison pour laquelle il est désactivé par défaut.

Vérifiez cette 23.4.0 disponible maintenant

Mise à jour : cela ne fonctionne pas à partir de la version 23.3.0. Vérifiez ici pour plus de détails. Les drawables proxy ne fonctionnent pas. app:srcCompatet setImageResource()travailler, cependant.


La prise en charge de Vector Drawable est disponible dans la bibliothèque de support de la version 23.2 et au-delà. Cependant, pour utiliser correctement ces drawables, ils doivent être référencés indirectement.

La première étape serait de modifier la AppCompatversion.

compile 'com.android.support:appcompat-v7:23.2.0'

Deuxièmement, activez la prise en charge de Vector Drawable. Si vous utilisez le plugin Gradle, 2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

Autrement

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

   aaptOptions {  
     additionalParameters "--no-version-vectors"  
   }  
}

Troisièmement , reportez-vous à la réponse liée .

tape-à-l'oeil
la source
oui, j'ai vu ça. Merci pour les informations détaillées. Je suppose que pour les éléments à l'échelle du système (notifications, widgets, ...), ce n'est bien sûr pas disponible ...
Développeur Android
Certain que cela devrait fonctionner. Il fait essentiellement référence aux drawables à partir de ce moment. L'as tu essayé? L'exemple ici définit un vecteur pouvant être dessiné sur a MenuItem, ce qui fonctionne très bien.
razzledazzle
Êtes-vous sûr que cela fonctionnera même pour les notifications et les widgets? Je parle de le faire fonctionner sur les anciennes versions d'Android. Comment pourraient-ils gérer les vecteurs pour cela? Ils ne peuvent pas utiliser la bibliothèque de support, non?
développeur android
L'intérêt d'utiliser la version Support Library est de faire fonctionner les choses dans les anciennes versions. Comme documenté, cela fonctionne depuis l'API 7 et les dessins vectoriels animés de l'API 11.
razzledazzle
Encore une fois, cela fonctionne dans l'application, mais que faire si vous essayez de les utiliser à l'extérieur, comme sur les notifications et les widgets? Je ne pense pas que cela fonctionnera là-bas, car je ne pense pas que vous puissiez faire en sorte que d'autres applications (lanceurs) utilisent la bibliothèque de support, sans parler de la barre de notification. L'as tu essayé?
développeur android
12

Vous pouvez essayer cette bibliothèque de support . Il prend en charge VectorDrawable et AnimatedVectorDrawable introduit dans Lollipop avec une compatibilité entièrement descendante.

V_J
la source
Cette bibliothèque n'est compatible qu'avec le niveau d'API 14 et supérieur, tandis que la bibliothèque Mr Vector est compatible jusqu'à 7+.
donturner
@donturner: Je suis d'accord avec votre point de vue, mais je ne pense pas que les développeurs développent encore des applications pour 7 API.
V_J le
4
Peut-être pas API 7, mais certainement API 10 (Gingerbread) car cela représente 4,1% du marché Android ( developer.android.com/about/dashboards/index.html ).
donturner
8

Pour compléter certaines des réponses ici: oui, vous pouvez obtenir un support pour VectorDrawables pré-Lollipop , au moins partiel.

À quel point? Cela dépend - j'ai fait ce diagramme pour vous aider (valable pour Support Library 23.4.0 à - au moins - 25.1.0).

Feuille de triche à dessiner

David Ferrand
la source
En effet, mais je pense que si vous l'autorisez à générer automatiquement les fichiers png, cela devrait être sûr
Développeur Android
1
Expliqué de manière précise.
Abhijit Kurane
Cela devrait être la réponse acceptée. Merci.
Justin Meiners
6

Malheureusement, à ce stade, VectorDrawable et AnimatedVectorDrawable ne sont pas disponibles dans la bibliothèque de support. Mais pour profiter de cette fonctionnalité dans les versions Pre-Lollipop, vous pouvez utiliser le backport non officiel appelé MrVector.

MrVector est disponible dans Github et prend en charge les versions Android 7+.

Du Readme officiel

Pour ajouter une dépendance MrVector, ajoutez la ligne suivante à votre bloc de dépendances build.gradle.

compile 'com.telly:mrvector:0.2.0'

Pour créer le dessinable à partir du XML vectoriel,

Drawable drawable = MrVector.inflate(getResources(), R.drawable.vector_android);

J'espère que cela t'aides.

gnuanu
la source
1
MrVector a été abandonné il y a quelques jours au profit du prochain VectorDrawableCompat qui fera partie de la bibliothèque de support.
WindRider
C'est vraiment cool. Merci pour l'info.
gnuanu
Oui, j'ai hâte de pimp mon application avec des SVG gros cul: D
WindRider
1
Obsolète. Utilisez plutôt ce stackoverflow.com/a/30502261/1954675 .
V_J
3

Si vous utilisez VectorDrawable, Android Studio générera automatiquement les fichiers PNG correspondants (basés sur vos fichiers XML) pour les versions Pre-Lollipop.

Notez que ces fichiers PNG générés sont considérés comme BitmapDrawables au lieu de VectorDrawables sur les appareils exécutant une API inférieure à 21 et ne peuvent donc pas être animés ou similaires sur ces appareils.

Pour plus de détails, reportez-vous à la section «rétrocompatibilité»: http://android-developers.blogspot.co.at/2015/09/android-studio-14.html

Mehlyfication
la source
Oui, il a été publié récemment. Cependant, il utilise des PNG, au lieu d'utiliser les vecteurs, donc si je change la taille de l'imageView qui contient l'image, elle sera pixélisée / floue.
développeur android
@android developer: Vous avez partiellement raison. Ce problème se produira, mais ce serait le même pour VectorDrawables. Chaque VectorDrawable a une largeur et une hauteur définies dans son XML (par exemple vector_drawable.xml). Si cette largeur / hauteur est définie sur 50x50dp mais que vous définissez la taille ImageView sur 100x100dp, le résultat sera toujours flou même si vous utilisez Android 5.0 (et que vous utilisez donc VectorDrawable au lieu d'un BitmapDrawable généré automatiquement). Le véritable avantage d'un VectorDrawable par rapport à un Bitmap commun est qu'il prend en compte la résolution d'écran et ne sera donc pas flou même sur les écrans 4k.
Mehlyfication
Vous voulez dire que VectorDrawable ne s'affiche pas bien lorsque vous utilisez une taille qui n'a pas été définie pour lui? Mais c'est un contenu vectorisé ... Pourquoi cela fonctionnerait-il autrement?
développeur android
Génère-t-il également des png pour les dessins vectoriels animés?
Louis CAD
Non, il ne créera pas de PNG pour ce cas. Si vous souhaitez animer un dessin vectoriel sur des appareils exécutant une version Android antérieure à Android 5.0, vous voudrez peut-être essayer VectorDrawableCompat: developer.android.com/reference/android/support/graphics/…
Mehlyfication
3

Lollipop ne peut pas gérer les fichiers SVG sans bibliothèques tierces.

La meilleure solution que j'ai trouvée est la bibliothèque BetterVectorDrawable avec le convertisseur SVG en VectorDrawable .

BetterVectorDrawable est l'implémentation de VectorDrawable pour Android 4.0+ avec un comportement de secours configurable sur Android 5.0+.

SVG to VectorDrawable Converter est le convertisseur par lots d'images SVG en fichiers de ressources XML Android VectorDrawable. Version en ligne

Les liens pointent vers les readmes, qui fournissent suffisamment d'informations sur la façon d'utiliser la bibliothèque et le convertisseur.

Un élève
la source
2

Il n'y a pas de VectorDrawables dans la bibliothèque de support pour le moment.

Funkystein a raison - VectorDrawable est similaire à SVG, ne prenant en charge que les fonctionnalités de dessin vectoriel les plus demandées afin qu'Android puisse se concentrer sur les performances. pathData, par exemple, a le même format que la chaîne "d" de SVG.

George Mount
la source
Cela ne sera donc pertinent que lorsque Lollipop deviendra suffisamment populaire, et même dans ce cas, il ne fournit pas beaucoup de fonctionnalités. :(
développeur android
Connaissez-vous un tutoriel / échantillon / vidéo des nouvelles API vectorielles?
développeur android
2
J'en ai trouvé un maintenant: blog.sqisland.com/2014/10/… , github.com/chiuki/animated-vector-drawable
développeur android
1

La bonne nouvelle est que Google a publié la bibliothèque de support Android 23.2 Support Vector Drawables et Animated Vector Drawables!

Mais merci aux personnes qui ont porté cette bibliothèque avant Google!

C'est là que les bibliothèques AppCompat sont excellentes, elles peuvent ramener de nombreuses nouvelles fonctionnalités d'Android à des versions beaucoup plus anciennes. Avec la classe VectorDrawable nouvellement implémentée, les développeurs peuvent désormais utiliser des images vectorielles depuis l'API 7 (Android 2.1 Eclair). Les vecteurs animés sont un peu plus limités, ne remontant qu'à l'API 11 (Android 3.0 Honeycomb), mais cela englobe toujours plus de 97% des appareils en utilisation active aujourd'hui

Guide d'utilisation:

Reportez - vous à "l' âge des vecteurs " par @chrisbanes

LOG_TAG
la source
1
Agréable! pouvez-vous s'il vous plaît partager quelques exemples / tutoriels sur la façon d'utiliser l'API de vecteurs de la nouvelle bibliothèque de support?
développeur android
Sûr ! déjà ajouté cela à ma liste de choses à faire pour le week-end! :)
LOG_TAG
1
Merci. S'il est court, veuillez également écrire ici.
développeur android