2016-07-04 8 views
13

Ich ersetze alle meine Icons mit VectorDrawables wo immer möglich. Aber ich habe bemerkt, dass ein paar von ihnen nicht korrekt auf API 23 rendern und die Farbe scheint zu bluten. Einer von diesen 3 macht gut. Hier ist ein Screenshot von einem isolated project I erstellt:VectorDrawable wird nicht richtig auf API gerendert 23

enter image description here

Sieht völlig in Ordnung, auf API 21:

enter image description here

The source code of sample app is here

ich verwende AppCompat 24.0.0, App: srcCompat auf ImageView und haben festgelegt vectorDrawables.useSupportLibrary = true. Ich habe auch AppCompat 23.4.0 mit Ziel 23 versucht. Wenn ich jedoch appCompat entferne und minSdkVersion auf 21 setze und native Vektorunterstützung verwende, ändern sich die Ergebnisse nicht. Die IDE beschwert sich nicht darüber, dass irgendetwas nicht unterstützt wird. Wie finde ich heraus, was das Problem ist? Ist es ein Plattformfehler? Gibt es Workarounds?

+0

bro .. versuchen Sie, Ihre Version ein wenig auf 23.0.3 downgraden, ich auch mit VectorDrawable .. nd es funktioniert gut in 23. –

+0

Sieht nicht wie eine appcompat Version Problem für mich, da es gleich bleibt auch nach Ich entferne appcompat. – gitter

+0

Welches Gerät (api 23) benutzen Sie? Hast du auf Emulator getestet? mit API-Ebene 23 Vektor unter Verwendung der Systemstandardimplementierung des Vektors drawable zeichnend, würde ich sagen, höchstwahrscheinlich ist ROM-Problem – Stepango

Antwort

15

Zunächst einmal bin ich kein Android-Entwickler, ich bin ein Designer, der bei einigen Produktionsanlagen in Android Studio hilft.

Wir begannen die gleichen Probleme mit einigen unserer Vektor Drawables von 22 bis 24 nach oben bewegt erleben

(ich mein Projekt aktualisiert Nexus verwenden 6 API 23 und kompilieren 24 Version, Build-Version 24, Ziel SDK 24. Dann erschien meine Drawables Pfade zu schließen und das Hinzufügen von ähnlichen füllt, was oben geschieht.)

Versuchte

ich habe Zugang zu Adobe Illustrator CC (19.2.1) und haben verschiedene erforscht Pfad auf ein Objekt mit einem Strich. Alles von sich aus erweiternden Pfaden bis hin zu füllen, Pfade verbinden, zusammengesetzte Pfade machen, Pfade schließen usw. ohne Glück.

Converter Optionen

Die Online-SVG Drawable Converter (http://inloop.github.io/svg2android/) hat eine Option "Bake verwandelt sich in Pfad (experimentell)," und wähle ich das und obwohl es das Rendering verbessert, es war NICHT perfekt noch.

mögliche Lösung

Dann ging ich in Illustrator wieder und versucht, "Speichern unter" SVG vs. "Export" als SVG. Ich bin mir nicht sicher, welche Unterschiede Adobe Illustrator zwischen den beiden Einstellungen hat, aber sie spucken leicht unterschiedliche SVG-XML-Daten aus.

Ich nahm dann die neue "Save As SVG" und in diesem Online-Drawable Converter fiel: http://inloop.github.io/svg2android/

Und hatte diese Optionen geprüft:

  • ohne Attribute leer Gruppen entfernen
  • Bake Transformationen in Pfad (experimentell)

Das neue Drawable XML, das zurückgegeben wurde, scheint Arbeit zu sein richtig wiedergegeben und gerendert werden.

Ich bin mir nicht sicher, ob dies mit anderen Vektorgrafiken, die Striche, Formen und Füllungen haben, funktioniert, dachte aber, ich würde meine Erfahrung teilen. Dies ist keine echte Lösung, da es sich um einen Fehler im neuen Android-SDK handelt, der bereits zuvor unterstützt wurde, aber möglicherweise für einige Benutzer vorübergehend funktioniert.

+0

Ich kann bestätigen, dass dies für mich funktioniert hat mit Illustrator CC 20.1.0. Das hat meinen Tag bereichert! –

+2

Ich bestätige, dass auch ohne die Verwendung von http://inloop.github.io/svg2android/, die "sa ve as" von Illutrateur feine Svg aber "Export" nicht. –

+0

Ich kann bestätigen, dass dies für mich mit http://inloop.github.io/svg2android/ funktioniert hat. Ich danke dir sehr! Die betroffenen Geräte waren Android Studio-Emulatoren und Samsung-Geräte (sogar auf Marshmallow). – Cheruby

8

Ich hatte genau das gleiche Problem nur auf API 23. Ich habe meine ImageView-Quelle dynamisch anstatt in XML festgelegt. Ich erkannte das Problem war, dass ich tat:

Drawable show = getContext().getResources().getDrawable(resourceId); 

Wenn ich getan haben sollte:

Drawable show = AppCompatResources.getDrawable(getContext(), resourceId); 

Ich hoffe, das hilft jemand!

+1

Genau das habe ich falsch gemacht. Danke für deinen Beitrag –