Je travaille sur un projet Android et j'ai choisi <vector>
pour afficher l'icône car elle est adaptable et dynamique. Toutefois, je ne peux exécuter cette application que sur des appareils fonctionnant sous Android, dotés de l'API 21 ou supérieure. . Ma question est la suivante: comment utiliser <vector>
sur la version inférieure Android, c'est-à-dire l'API 14 ou une sorte de. Merci!
<!-- drawable/ic_Android_debug_bridge.xmlxml -->
<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:height="48dp"
Android:width="48dp"
Android:viewportWidth="24"
Android:viewportHeight="24">
<path Android:fillColor="@color/primaryColorDark"
Android:pathData="M15,9A1,1 0 0,1 14,8A1,1 0 0,1 15,7A1,1 0 0,1 16,8A1,1 `0 0,1 15,9M9,9A1,1 0 0,1 8,8A1,1 0 0,1 9,7A1,1 0 0,1 10,8A1,1 0 0,1 9,9M16.12,4.37L18.22,2.27L17.4,1.44L15.09,3.75C14.16,3.28 13.11,3 12,3C10.88,3 9.84,3.28 8.91,3.75L6.6,1.44L5.78,2.27L7.88,4.37C6.14,5.64 5,7.68 5,10V11H19V10C19,7.68 17.86,5.64 16.12,4.37M5,16C5,19.86 8.13,23 12,23A7,7 0 0,0 19,16V12H5V16Z" /></vector>`
Vector Drawables est désormais compatible avec les versions antérieures. Il suffit simplement de mettre à niveau votre version de version vers la version 1.4.0-beta3 ou supérieure et de mettre à niveau votre IDE:
Nous sommes également heureux d’offrir la compatibilité avec les versions antérieures de vos ressources vectorielles dans Android Studio 1.4. Une fois que vous avez une image vectorDrawable dans votre res/drawable, le plugin Gradle générera automatiquement des images PNG raster pour les API de niveau 20 et inférieur pendant la phase de construction. Cela signifie que vous devez uniquement mettre à jour et gérer votre actif vectoriel pour votre projet d'application. Android Studio peut prendre en charge le processus de conversion d'image.
http://Android-developers.blogspot.com.uy/2015/09/Android-studio-14.html
VectorDrawable sont pris en charge avant Lollipop via la bibliothèque de support , mais leur utilisation dépend de la version de ce support. Et cela peut ne pas fonctionner dans tous les cas.
J'ai fait ce diagramme pour aider (valable pour Support Library 23.4.0 à - au moins - 25.1.0).
Avec la bibliothèque de support 23.2, le support réel pour Vector Drawables a été fourni jusqu’à API v7. Il est recommandé de désactiver la version précédente du support, qui rendait le PNG pendant la construction, en ajoutant
// Gradle Plugin 2.0+
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
dans le fichier build.gradle
.
La mise en œuvre est assez simple. Il y a un nouvel attribut srcCompat sur Drawables:
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" /> <= this is new
Les dessins vectoriels sont également pris en charge dans des cas tels que la propriété drawableLeft
de TextView.
Source: annonce de la bibliothèque
Cependant, je recommanderais toujours quelque chose comme bibliothèque Iconics , AndroidSVG , ou une autre solution font-icon ou SVG pour une prise en charge complète de la norme SVG.
J'ai trouvé la solution! Pour ceux qui recherchent une solution avec TextView et d’autres attributs d’espace de noms "Android". Tout d’abord, c’est nécessaire:
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
Et dans la classe d'application, définissez ceci:
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
Vous pouvez maintenant utiliser app:srcCompat="@drawable/ic_add"
, mais si vous essayez d'utiliser Android:background=
ou Android:drawableLeft=
, l'application se plantera avec une exception "Erreur de gonflage".
Nous pouvons créer un ic_add_wrapped.xml
dessiné enveloppé pour ce vecteur:
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/ic_add"/>
</layer-list>
Et maintenant, cela fonctionnera avec n'importe quelle propriété comme drawableLeft ou background. Il suffit de définir Android:drawableLeft="@drawable/ic_add_wrapped.xml"
. ATTENTION! CECI IS UNE SOLUTION DE CONTOURNEMENT. Donc, vous l'utilisez à vos risques et périls.
vous devez utiliser Android Support Repository 30+ si vous utilisez Android studio et que vous avez besoin de Android bibliothèque de support 23.2.1+ si vous utilisez Eclipse.
vérifiez votre build.gradle
(projet) si vous utilisez la version 2.0+, ajoutez le code ci-dessous dans votre build.gradle
(application)
// Gradle Plugin 2.0+
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
et: si vous utilisez la version 1.5, ajoutez ci-dessous dans votre build.gradle
(app)
// Gradle Plugin 1.5
Android {
defaultConfig {
generatedDensities = []
}
// This is handled for you by the 2.0+ Gradle Plugin
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
voici un exemple de code pour l'icône de vecteur d'utilisation:
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add"
tools:ignore="MissingPrefix" />
ou
<ImageButton
Android:layout_width="wrap_content"
Android:background="@Android:color/transparent"
app:srcCompat="@drawable/camera"
tools:ignore="MissingPrefix"
Android:layout_height="wrap_content"/>
Les dessins vectoriels sont également pris en charge dans des cas tels que la propriété drawableLeft
de TextView. mais cela a fonctionné api 22+ pour moi et je ne sais toujours pas comment cela fonctionnera pour faible api.
Gardez également à l'esprit si vous voulez être compatible avec l'API 21:
Android:background
dans les fonctions xml ou View.setBackgroundResource()
. Vous devez utiliser la View.setBackground()
.Lorsque vous devez ajouter VectorDrawable (créé à partir de SVG) par programme, vous pouvez le faire comme suit:
icon = VectorDrawableCompat.create(resources, R.drawable.ic_map_black_24dp, null)
Pour les versions inférieures compatibles,
ajouter le ci-dessous en grade,
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
ajoutez le code ci-dessous dans onCreate () dans votre classe d'application,
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
En XML pour imageView,
<ImageView
Android:id="@+id/imageViewMessage"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@color/transparent"
app:srcCompat="@drawable/ic_success"/>
Si vous voulez changer la source de l'image par programme, utilisez ceci,
imageView.setImageResource(R.drawable.ic_launcher);
J'ai eu un problème où mes images vectorielles apparaissaient mais étaient complètement noires. Cela était dû à un problème qui empêchait la référence aux ressources de couleur dans le fichier xml vector.
Ainsi, au lieu de @color/primaryColorDark
, vous devez utiliser la couleur réelle, par exemple. #212121
Si vous utilisez Android Studio 3.0.0, vous pouvez définir
Android.enableAapt2=false
dans gradle.properties
https://www.reddit.com/r/androiddev/comments/6mj8di/Android_studio_30_canary_6_released/
Juste pour compléter la réponse de @ 2Dee:
VectorDrawable ne peut pas être utilisé sur les API 20 et inférieures. La méthode officielle génère des pngs, qui deviennent ensuite BitmapDrawables, ce qui rompt l’idée des graphiques vectoriels.
Personnellement, je préfère les svg aux vecteurs xml:
Pour utiliser des graphiques vectoriels, vous pouvez essayer https://github.com/BigBadaboom/androidsvg . C'est un lecteur SVG et une ImageView compatible SVG.
Vous pouvez utiliser par programme .. pour définir drawableLeft
sur votre editText
ou textView
comme
Drawable tick_drawable = VectorDrawableCompat.create(getResources(), R.drawable.green_tick, null);
if (tick_drawable != null) {
tick_drawable.setBounds(0, 0, tick_drawable.getIntrinsicWidth(),tick_drawable.getIntrinsicHeight());
}
Et à gauche gauche comme ça ..
editText.setCompoundDrawables( tick_drawable , null, null, null );
après avoir défini vectorDrawables.useSupportLibrary = true par défaut dans le dégradé et AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); en activité sur create
Pour éviter les plantages avec Android: drawableleft dans Textview, définissez drawble à gauche sur textview par programme par exemple:
textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);