web-dev-qa-db-fra.com

Comment utiliser les vecteurs drawables dans Android API lower 21?

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>`
59
iamatsundere181

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

25
2Dee

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).

VectorDrawable cheatsheet

77
David Ferrand

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.

76
Alen Siljak

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.

39
Yazon2006

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:

  • vous ne pouvez pas utiliser la propriété Android:background dans les fonctions xml ou View.setBackgroundResource(). Vous devez utiliser la View.setBackground().
  • vous ne pouvez pas utiliser le svg-s dans StateListDrawable xml-s ou d'autres tirables au xml, vous devez les générer par programme.
  • vous ne pouvez pas utiliser svg-s en cas de notifications.
20
mehrdad khosravi

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)
16
cVoronin

Pour les versions inférieures compatibles,

  1. ajouter le ci-dessous en grade,

    Android {  
       defaultConfig {  
         vectorDrawables.useSupportLibrary = true  
        }  
     }
    
  2. ajoutez le code ci-dessous dans onCreate () dans votre classe d'application,

    @Override
        public void onCreate() {
            super.onCreate();
            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        }
    
  3. 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"/>
    
  4. Si vous voulez changer la source de l'image par programme, utilisez ceci,

    imageView.setImageResource(R.drawable.ic_launcher);
    
5
Kavya Shravan

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

4
Mark O'Sullivan

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/

2
Patrick Henderson

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:

  • ces graphiques peuvent être exportés directement à partir d'Illustrator ou d'un autre logiciel populaire
  • svg prend en charge correctement les transformations, le texte, les masques et autres
  • vrais graphiques vectoriels scallable sur toutes les plateformes
  • taille plus petite et construction plus rapide

Pour utiliser des graphiques vectoriels, vous pouvez essayer https://github.com/BigBadaboom/androidsvg . C'est un lecteur SVG et une ImageView compatible SVG.

2
Zielony

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 );
2
Santanu Sur

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);
0