VectorDrawable - ist es irgendwie für Pre-Lollipop-Versionen von Android verfügbar? [geschlossen]

86

Hintergrund

Ich habe festgestellt, dass Android jetzt eine Art Vektorzeichnung über eine Klasse namens " VectorDrawable " (und auch AnimatedVectorDrawable , BTW) unterstützt. Ich habe es herausgefunden, indem ich mir angesehen habe, was es Neues in Android-Studio gibt .

Ich frage mich , ob dies das Ende mit würde mehrere Dateien in mehrere Ordner setzen ( mdpi, hdpi, xhdpi, usw.). Das wäre großartig und könnte in einigen Fällen die Größe von Apps minimieren.

Die Fragen

Ich möchte ein paar Fragen zu dieser neuen Klasse stellen:

  1. Ist es möglich, es in älteren Android-Versionen zu verwenden, möglicherweise über eine Bibliothek der Support-Bibliothek von Google?

  2. Ich bin nicht mit der Funktionsweise vertraut, aber kann Lollipop mit SVG-Dateien umgehen? Kann es etwas tun, was mit SVG-Dateien erreichbar ist?

  3. Gibt es ein Beispiel / Tutorial / Video für die Verwendung außer der Dokumentation, die ich gefunden habe?

Android-Entwickler
quelle
3
Soweit ich sehen kann, ist VectorDrawable die Androidisierung von SVG-Dateien. Ich verwende SVGs seit über einem Jahr mithilfe von Bibliotheken von Drittanbietern . ( Android-SVG , SVG-Android und so). Es gibt ähnlich benannte. Jeder unterscheidet sich von den anderen. Wählen Sie ihn daher je nach Ihren Anforderungen genau aus.
Phantômaxx
7
Ich habe ein Online-Tool zum Konvertieren von SVG in einen XML-Ressourcenvektor (nur Lollipop) erstellt - inloop.github.io/svg2android - Es wurde noch nicht so oft im frühen Alpha getestet. Es unterstützt einfache SVG-Dateien (wie Android unterstützt), ich habe es mit Inkscape getestet - einige Formen gezeichnet (Rechteck, Kreis, Spirale ...), alle auswählen, dann "Pfad-> Objekt zu Pfad", exportiert in * .svg und auf der Website abgelegt, XML generiert und funktioniert gut.
Yuraj
1
@ Yuraj Wow, es ist so cool! Gute Arbeit ! Und in so kurzer Zeit ... Hier, nimm meine +1. :)
Android-Entwickler
In Bezug auf inloop.github.io/svg2android ... Es s a very usefull tool but Ihat in einem solchen Fall ein falsches Ergebnis und ich weiß nicht, was falsch ist ... Hmmm, für die weitere Veröffentlichung würde ich mir wünschen, dass dieses Tool über ein schlechtes Format informiert wird ... Wenn ich benutzte reine SVG-Dateien mit 3-Party-Bibliotheken alles ist in
Ordnung
@AlexZezekalo Sie sollten darüber auf seiner Github-Webseite schreiben: github.com/inloop/svg2android
Android-Entwickler

Antworten:

39

UPDATE AM März 2016

Von Android Support Library 23.2.1 Update, Support Vector Drawables und Animated Vector Drawables. (Sie können auch lastoneone für das gleiche verwenden)

Bitte aktualisieren Sie die Version einer Bibliothek in der Gradle-Datei.

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

Mit Vector Drawables können Sie mehrere PNG-Assets durch eine einzige in XML definierte Vektorgrafik ersetzen . Während früher auf Lollipop und höher Geräte beschränkt , die beide VectorDrawableund AnimatedVectorDrawablesind jetzt durch zwei neue Support - Bibliotheken Unterstützung-Vektor-ziehbar und animierte-Vektor-ziehbar. neues app:srcCompatAttribut für Referenzvektor-Drawables.

Überprüfen Sie die Quelle auf Github mit einigen Beispielbeispielen .

Änderungen für die Appcompat-Bibliothek v7:

Die Abhängigkeit von Vektor-Assets wurde rückgängig gemacht, sodass Entwickler, die die Appcompat-Bibliothek verwenden, nicht gezwungen sind, die VectorDrawablezugehörigen Build-Flags zu verwenden.

Amit Vaghela
quelle
3
Reicht es nicht aus, das Gradle-Plugin zu aktualisieren und "vectorDrawables.useSupportLibrary = true" in "defaultConfig" zu verwenden?
Android-Entwickler
1
Ja, für Gradle Plugin 2.0+ und für Gradle Plugin 1.5 müssen Sie hinzufügen -> android {defaultConfig {generateDensities = []} // Dies wird für Sie vom 2.0+ Gradle Plugin aaptOptions {AdditionalParameters "--no-version behandelt -vectors "}}
Amit Vaghela
1
Bitte zeigen Sie hier auch einen Code. Ein Link könnte eines Tages tot sein. Sie erhalten +1 für diese Anstrengung :)
Android-Entwickler
ja sicher. werde in kurzer Zeit Code auf git und hier posten.
Amit Vaghela
2
Die compileobige Aussage impliziert, dass das Projekt verwendet, RecyclerViewwas nicht immer der Fall ist.
Razzledazzle
13

Update 2 : Sie aktivieren es wieder in der Support Library 23.4.0:

Für AppCompat-Benutzer haben wir eine Opt-In-API hinzugefügt, um die Unterstützung von Vector Drawables aus Ressourcen (das in 23.2 beschriebene Verhalten) über AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) wieder zu aktivieren. Beachten Sie, dass dies weiterhin Probleme mit der Speichernutzung und verursachen kann Probleme beim Aktualisieren von Konfigurationsinstanzen, daher ist diese standardmäßig deaktiviert.

Überprüfen Sie diese 23.4.0 jetzt verfügbar

Update : Dies funktioniert nicht ab Version 23.3.0. Weitere Informationen finden Sie hier . Proxy-Drawables funktionieren nicht. app:srcCompatund setImageResource()arbeiten jedoch.


Vector Drawable-Unterstützung ist in der Support-Bibliothek ab Version 23.2 verfügbar. Um diese Zeichen jedoch ordnungsgemäß verwenden zu können, muss indirekt auf sie verwiesen werden.

Der erste Schritt wäre, die AppCompatVersion zu stoßen .

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

Zweitens aktivieren Sie die Unterstützung von Vector Drawable. Bei Verwendung des Gradle-Plugins 2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

Andernfalls

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

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

Drittens beziehen Sie sich auf die verknüpfte Antwort .

razzledazzle
quelle
Ja, ich habe das gesehen. Vielen Dank für die erweiterten Informationen. Ich gehe davon aus, dass dies für systemweite Inhalte (Benachrichtigungen, Widgets, ...) natürlich nicht verfügbar ist ...
Android-Entwickler
Sicher, dass es funktionieren sollte. Von diesem Punkt an bezieht es sich im Wesentlichen auf Drawables. Hast du es versucht? Das Beispiel dort setzt einen Vektor, der auf a gezeichnet werden kann MenuItem, was gut funktioniert.
Razzledazzle
Sind Sie sicher, dass es auch für Benachrichtigungen und Widgets funktioniert? Ich spreche davon, dass es auf alten Android-Versionen funktioniert. Wie könnten sie dafür mit Vektoren umgehen? Sie können die Support-Bibliothek nicht nutzen, oder?
Android-Entwickler
Der springende Punkt bei der Verwendung der Support Library-Version ist, dass die älteren Versionen funktionieren. Wie dokumentiert, funktioniert es bis zurück zu API 7 und animierten Vektor-Drawables von API 11.
Razzledazzle
Auch dies funktioniert innerhalb der App, aber was ist, wenn Sie versuchen, sie außerhalb zu verwenden, wie bei Benachrichtigungen und Widgets? Ich denke nicht, dass es dort funktionieren wird, weil ich nicht denke, dass Sie andere Apps (Starter) dazu bringen können, die Support-Bibliothek zu verwenden, geschweige denn die Benachrichtigungsleiste. Hast du es versucht?
Android-Entwickler
12

Sie können diese Support-Bibliothek ausprobieren . Es unterstützt VectorDrawable und AnimatedVectorDrawable, die in Lollipop eingeführt wurden, und ist vollständig abwärtskompatibel.

V_J
quelle
Diese Bibliothek ist nur mit API Level 14 und höher kompatibel, während die Mr Vector-Bibliothek bis zu 7+ kompatibel ist.
Donturner
@donturner: Ich stimme Ihrem Standpunkt zu, aber ich glaube nicht, dass Entwickler noch Apps für die 7-API entwickeln.
V_J
4
Möglicherweise nicht API 7, aber definitiv API 10 (Lebkuchen), da dies 4,1% des Android-Marktes ausmacht ( developer.android.com/about/dashboards/index.html ).
Donturner
8

Um einige der Antworten hier zu ergänzen: Ja, Sie können zumindest teilweise Unterstützung für VectorDrawables vor Lollipop erhalten .

Wie teilweise? Es kommt darauf an - ich habe dieses Diagramm erstellt , um zu helfen (gültig für Support Library 23.4.0 bis - mindestens - 25.1.0).

VectorDrawable Cheatsheet

David Ferrand
quelle
In der Tat, aber ich denke, wenn Sie es erlauben, die PNG-Dateien automatisch zu generieren, sollte es sicher sein
Android-Entwickler
1
Auf präzise Weise erklärt.
Abhijit Kurane
Dies sollte die akzeptierte Antwort sein. Vielen Dank.
Justin Meiners
6

Leider sind VectorDrawable und AnimatedVectorDrawable derzeit nicht in der Support-Bibliothek verfügbar. Um diese Funktion in Pre-Lollipop-Versionen nutzen zu können, können Sie den inoffiziellen Backport MrVector verwenden.

MrVector ist in Github verfügbar und unterstützt Android-Versionen 7+.

Aus der offiziellen Readme

Fügen Sie zum Hinzufügen der MrVector-Abhängigkeit die folgende Zeile zu Ihrem build.gradle-Abhängigkeitsblock hinzu.

compile 'com.telly:mrvector:0.2.0'

Um das Drawable aus dem Vektor-XML zu erstellen,

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

Hoffe das hilft.

Gnuanu
quelle
1
MrVector wurde vor einigen Tagen zugunsten des kommenden VectorDrawableCompat, der Teil der Support-Bibliothek sein wird, abgelehnt.
WindRider
Das ist wirklich cool. Danke für die Information.
Gnuanu
Ja, ich kann es kaum erwarten, meine App mit ein paar fetten
SVGs aufzupimpen
1
Veraltet. Verwenden Sie stattdessen diesen stackoverflow.com/a/30502261/1954675 .
V_J
3

Wenn Sie VectorDrawable verwenden, generiert Android Studio automatisch entsprechende PNG-Dateien (basierend auf Ihren XML-Dateien) für Pre-Lollipop-Versionen.

Beachten Sie, dass diese generierten PNG-Dateien auf Geräten mit einer API unter 21 als BitmapDrawables anstelle von VectorDrawables betrachtet werden und daher auf diesen Geräten nicht animiert oder ähnlich sein können.

Weitere Informationen finden Sie unter "Abwärtskompatibilität": http://android-developers.blogspot.co.at/2015/09/android-studio-14.html

Mehlyfikation
quelle
Ja, es wurde kürzlich veröffentlicht. Es werden jedoch PNGs anstelle der Vektoren verwendet. Wenn ich also die Größe der Bildansicht ändere, in der sich das Bild befindet, wird es pixelig / verschwommen.
Android-Entwickler
@ Android Entwickler: Sie haben teilweise recht. Dieses Verhalten tritt auf, dies gilt jedoch auch für VectorDrawables. Für jedes VectorDrawable sind Breite und Höhe in seinem XML definiert (z. B. vector_drawable.xml). Wenn diese Breite / Höhe auf 50 x 50 dp festgelegt ist, Sie jedoch die ImageView-Größe auf 100 x 100 dp festlegen, wird das Ergebnis auch dann unscharf, wenn Sie Android 5.0 ausführen (und daher VectorDrawable anstelle eines automatisch generierten BitmapDrawable verwenden). Der eigentliche Vorteil eines VectorDrawable gegenüber einer herkömmlichen Bitmap besteht darin, dass es die Bildschirm-dpi berücksichtigt und daher auch auf 4k-Displays nicht unscharf wird.
Mehlyfication
Sie meinen, dass VectorDrawable nicht gut angezeigt wird, wenn eine Größe verwendet wird, die nicht dafür festgelegt wurde? Aber es ist ein vektorisierter Inhalt ... Warum sollte es sonst funktionieren?
Android-Entwickler
Generiert es auch PNGs für animierte Vektorzeichnungen?
Louis CAD
Nein, für diesen Fall werden keine PNGs erstellt. Wenn Sie Vector Drawable auf Geräten animieren möchten, auf denen die Android-Version vor Android 5.0 ausgeführt wird, sollten Sie VectorDrawableCompat ausprobieren: developer.android.com/reference/android/support/graphics/…
Mehlyfication
3

Lollipop kann SVG-Dateien nicht ohne Bibliotheken von Drittanbietern verarbeiten.

Die beste Lösung, die ich gefunden habe, ist die BetterVectorDrawable-Bibliothek zusammen mit dem SVG to VectorDrawable-Konverter .

BetterVectorDrawable ist die VectorDrawable-Implementierung für Android 4.0+ mit konfigurierbarem Fallback-Verhalten unter Android 5.0+.

SVG to VectorDrawable Converter ist der Stapelkonverter von SVG-Bildern in Android VectorDrawable XML-Ressourcendateien. Online Version

Links verweisen auf Readmes, die genügend Informationen zur Verwendung der Bibliothek und des Konverters enthalten.

Ein Student
quelle
2

Derzeit befinden sich keine VectorDrawables in der Support-Bibliothek.

Funkystein hat recht - VectorDrawable ähnelt SVG und unterstützt nur die Funktionen des Vektorzeichnens, die am meisten nachgefragt werden, damit sich Android auf die Leistung konzentrieren kann. pathData hat beispielsweise das gleiche Format wie die SVG-Zeichenfolge "d".

George Mount
quelle
Dies ist also nur dann relevant, wenn Lollipop populär genug wird, und selbst dann bietet es nicht viele Funktionen. :(
Android-Entwickler
Kennen Sie ein Tutorial / Beispiel / Video der neuen Vektor-APIs?
Android-Entwickler
2
Ich habe jetzt eine gefunden: blog.sqisland.com/2014/10/… , github.com/chiuki/animated-vector-drawable
Android-Entwickler
1

Die gute Nachricht ist, dass Google die Android Support Library 23.2 veröffentlicht hat, die Vector Drawables und animierte Vector Drawables unterstützt!

Aber danke an die Leute, die diese Bibliothek vor Google portiert haben!

Hier sind die AppCompat-Bibliotheken großartig. Sie können viele der neuen Funktionen von Android auf viel frühere Versionen zurückführen. Mit der neu implementierten VectorDrawable-Klasse können Entwickler jetzt Vektorgrafiken bis zurück zu API 7 (Android 2.1 Eclair) verwenden. Animierte Vektoren sind etwas eingeschränkter und reichen nur bis zu API 11 (Android 3.0 Honeycomb) zurück, aber das umfasst immer noch mehr als 97% der Geräte, die heute aktiv verwendet werden

Gebrauchsanweisung:

Siehe " Age-of-the-Vectors " von @chrisbanes

LOG_TAG
quelle
1
Nett! Können Sie uns bitte einige Beispiele / Tutorials zur Verwendung der Vektor-API der neuen Support-Bibliothek mitteilen?
Android-Entwickler
Sicher ! habe das schon zu meiner Wochenend-To-Do-Liste hinzugefügt! :)
LOG_TAG
1
Danke dir. Wenn es kurz ist, schreiben Sie bitte auch hier.
Android-Entwickler