VectorDrawable - è disponibile in qualche modo per le versioni pre-Lollipop di Android? [chiuso]


87

sfondo

Ho notato che Android ora supporta una sorta di disegno vettoriale, tramite una classe chiamata " VectorDrawable " (e anche AnimatedVectorDrawable , BTW). L'ho scoperto guardando le novità di Android-Studio .

Mi chiedo se questo sarebbe la fine di dover mettere più file in più cartelle ( mdpi, hdpi, xhdpi, ecc). Sarebbe fantastico e potrebbe ridurre al minimo le dimensioni delle app in alcuni casi.

Le domande

Vorrei porre alcune domande riguardo a questa nuova classe:

  1. È possibile utilizzarlo nelle versioni precedenti di Android, magari tramite una libreria anche della libreria di supporto di Google?

  2. Non ho familiarità con come funziona, ma Lollipop può gestire i file SVG? Può fare qualcosa che è realizzabile sui file SVG?

  3. C'è qualche esempio / tutorial / video per usarlo, oltre alla documentazione che ho trovato?


3
Per quanto posso vedere, VectorDrawable è l' androide dei file SVG. Tuttavia, sto usando SVG da oltre un anno attraverso l'uso di librerie di terze parti . ( android-svg , svg-android e simili). Ce ne sono di nomi simili. Ognuna è diversa dalle altre, quindi scegli accuratamente in base alle tue esigenze.
Phantômaxx

7
Ho creato uno strumento online per convertire SVG in vettore di risorse xml (solo lecca-lecca) - inloop.github.io/svg2android - Non è stato testato così tanto all'inizio dell'alfa. Supporta semplici file svg (come supporta Android), l'ho testato con inkscape - ho disegnato alcune forme (rettangolo, cerchio, spirale ...), seleziona tutto quindi "Percorso-> Oggetto su percorso", esportato in * .svg e caduto nel sito, generato xml e funziona bene.
Yuraj

1
@ Yuraj Wow, è così bello! ottimo lavoro ! E in così poco tempo ... Ecco, prendi il mio +1. :)
sviluppatore Android

Riguardo a inloop.github.io/svg2android ... In s a very usefull tool but Iquesto caso ha ottenuto risultati impropri e non so cosa sia sbagliato ... Hmmm, per ulteriori versioni vorrei che questo strumento notifichi un formato errato ... Se lo faccio usato puri file svg con librerie di 3 parti tutto è ok ...
Alex Zezekalo

@AlexZezekalo Dovresti scriverne sulla sua pagina web Github: github.com/inloop/svg2android
sviluppatore Android

Risposte:


39

AGGIORNAMENTO A marzo 2016

Con l' aggiornamento della libreria di supporto Android 23.2.1 , Support Vector Drawables e Animated Vector Drawables. (puoi anche usare latestone per lo stesso)

Aggiorna la versione di una libreria nel file gradle.

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

I drawable vettoriali consentono di sostituire più risorse png con una singola grafica vettoriale , definita in XML. Sebbene precedentemente limitati a Lollipop e dispositivi superiori , entrambi VectorDrawablee AnimatedVectorDrawableora sono disponibili tramite due nuove librerie di supporto support-vector-drawable e animated-vector-drawable. nuovo app:srcCompatattributo per fare riferimento ai disegnabili vettoriali.

Controlla la fonte su GitHub con alcuni esempi di esempio .

Modifiche per la libreria appcompat v7:

Ripristinata la dipendenza dalle risorse vettoriali in modo che gli sviluppatori che utilizzano la libreria appcompat non siano costretti a utilizzare VectorDrawablee i flag di build associati.


3
Riguardo al supporto dei vettori, non è sufficiente aggiornare il plugin gradle e utilizzare "vectorDrawables.useSupportLibrary = true" all'interno di "defaultConfig"?
sviluppatore Android

1
sì, per Gradle Plugin 2.0+ e per Gradle Plugin 1.5 devi aggiungere -> android {defaultConfig {generatedDensities = []} // Questo è gestito per te dal Plugin Gradle 2.0+ aaptOptions {additionalParameters "--no-version -vectors "}}
Amit Vaghela

1
Inoltre, mostra del codice qui. Un collegamento potrebbe essere morto un giorno. Otterrai +1 per questo sforzo :)
sviluppatore Android

Sì sicuramente. pubblicherà il codice in breve tempo su git e qui.
Amit Vaghela

2
La compiledichiarazione di cui sopra implica che il progetto utilizza il RecyclerViewche non è sempre il caso.
razzledazzle

13

Aggiornamento 2 : lo abilitano di nuovo nella libreria di supporto 23.4.0:

Per gli utenti di AppCompat, abbiamo aggiunto un'API opt-in per riattivare il supporto Vector Drawables dalle risorse (il comportamento trovato in 23.2) tramite AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) - tieni presente che questo può ancora causare problemi con l'utilizzo della memoria e problemi durante l'aggiornamento delle istanze di configurazione, quindi perché è disabilitato per impostazione predefinita.

Controlla questo 23.4.0 disponibile ora

Aggiornamento : non funziona dalla versione 23.3.0 Controllare qui per i dettagli. I drawable proxy non funzionano. app:srcCompate setImageResource()lavorare, comunque.


Il supporto di Vector Drawable è disponibile dalla Support Library della versione 23.2 e successive. Tuttavia, per utilizzare correttamente tali drawables, è necessario fare riferimento indirettamente.

Il primo passo sarebbe sostituire la AppCompatversione.

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

In secondo luogo abilitare il supporto Vector Drawable. Se si utilizza il plug-in Gradle, 2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

Altrimenti

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

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

Terzo , fare riferimento alla risposta collegata .


si, l'ho visto. Grazie per le informazioni estese. Suppongo che per le cose a livello di sistema (notifiche, widget, ...) Questo è naturalmente non disponibile ...
sviluppatore Android

Certo che dovrebbe funzionare. Fondamentalmente fa riferimento ai drawables da quel punto in poi. L'hai provato? L'esempio qui imposta un vettore disegnabile su a MenuItem, che funziona bene.
razzledazzle

Sei sicuro che funzionerà anche per notifiche e widget? Sto parlando di farlo funzionare su vecchie versioni di Android. Come potrebbero gestire i vettori per questo? Non possono usare la libreria di supporto, no?
sviluppatore Android

Il punto centrale dell'utilizzo della versione della libreria di supporto è far funzionare le cose nelle versioni precedenti. Come documentato, funziona fino all'API 7 e ai disegnabili vettoriali animati dall'API 11.
razzledazzle

Ancora una volta, funziona all'interno dell'app, ma cosa succede se provi a usarli all'esterno, come nelle notifiche e nei widget? Non penso che funzionerà lì, perché non penso che tu possa fare in modo che altre app (lanciatori) utilizzino la libreria di supporto, per non parlare della barra delle notifiche. L'hai provato?
sviluppatore Android

12

Puoi provare questa libreria di supporto . Supporta VectorDrawable e AnimatedVectorDrawable introdotti in Lollipop con piena compatibilità con le versioni precedenti.


Quella libreria è compatibile solo con il livello API 14 e superiore, mentre la libreria Mr Vector è compatibile fino a 7+.
donturner

@donturner: sono d'accordo con il tuo punto, ma non credo che gli sviluppatori stiano ancora sviluppando app per 7 API.
V_J

4
Forse non API 7, ma sicuramente API 10 (Gingerbread) in quanto rappresenta il 4,1% del mercato Android ( developer.android.com/about/dashboards/index.html ).
donturner

8

Per completare alcune delle risposte qui: sì, puoi ottenere supporto per VectorDrawables pre-Lollipop , almeno parziale.

Quanto parziale? Dipende: ho creato questo diagramma per aiutare (valido per la libreria di supporto da 23.4.0 a - almeno - 25.1.0).

VectorDrawable cheatsheet


In effetti, ma penso che se gli permetti di generare automaticamente i file png, dovrebbe essere sicuro
sviluppatore Android

1
Spiegato in modo preciso.
Abhijit Kurane

Questa dovrebbe essere la risposta accettata. Grazie.
Justin Meiners

6

Sfortunatamente, in questo momento VectorDrawable e AnimatedVectorDrawable non sono disponibili nella libreria di supporto. Ma per usufruire di questa funzione nelle versioni Pre-Lollipop, puoi utilizzare il backport non ufficiale chiamato MrVector.

MrVector è disponibile in Github e supporterà le versioni di Android 7+.

Dal file Readme ufficiale

Per aggiungere la dipendenza MrVector aggiungi la seguente riga al tuo blocco delle dipendenze build.gradle.

compile 'com.telly:mrvector:0.2.0'

Per creare il disegnabile dal vettore XML,

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

Spero che sia di aiuto.


1
MrVector è stato deprecato pochi giorni fa a favore del prossimo VectorDrawableCompat che farà parte della libreria di supporto.
WindRider

È davvero fantastico. Grazie per le informazioni.
gnuanu

Sì, non vedo l'ora di potenziare la mia app con alcuni SVG
grossi

1
Deprecato. Utilizza invece questo stackoverflow.com/a/30502261/1954675 .
V_J

3

Se stai usando VectorDrawable, Android Studio genererà automaticamente i file PNG corrispondenti (basati sui tuoi file XML) per le versioni Pre-Lollipop.

Tieni presente che quei file PNG generati sono considerati BitmapDrawables invece di VectorDrawables sui dispositivi che eseguono API inferiori a 21 e quindi non possono essere animati o simili su quei dispositivi.

Vedere "compatibilità con le versioni precedenti" per ulteriori dettagli: http://android-developers.blogspot.co.at/2015/09/android-studio-14.html


Sì, è stato pubblicato di recente. Tuttavia, sta usando PNG, invece di usare i vettori, quindi se cambio la dimensione dell'immagine imageView che contiene l'immagine, sarà pixelata / sfocata.
sviluppatore Android

@ sviluppatore Android: in parte hai ragione. Si verificherà questo comportamento, ma sarà lo stesso per VectorDrawables. Ogni VectorDrawable ha una larghezza e un'altezza definite all'interno del suo XML (es. Vector_drawable.xml). Se questa larghezza / altezza è impostata su 50x50dp ma imposti la dimensione ImageView su 100x100dp, il risultato sarà comunque sfocato anche se stai utilizzando Android 5.0 (e quindi stai utilizzando VectorDrawable invece di un BitmapDrawable generato automaticamente). Il vero vantaggio di un VectorDrawable su un comune Bitmap è che tiene conto dei dpi dello schermo e quindi non si sfocerà nemmeno sui display 4k.
Mehlyfication

Vuoi dire che VectorDrawable non viene visualizzato bene quando si utilizza una dimensione che non è stata impostata per esso? Ma è un contenuto vettorializzato ... Perché dovrebbe funzionare diversamente?
sviluppatore Android

Genera png anche per i Drawables vettoriali animati?
Louis CAD

No, non creerà PNG per quel caso. Se desideri animare il disegno vettoriale su dispositivi con versioni Android precedenti ad Android 5.0, potresti provare VectorDrawableCompat: developer.android.com/reference/android/support/graphics/…
Mehlyfication

3

Lollipop non può gestire file SVG senza librerie di terze parti.

La soluzione migliore che ho trovato è la libreria BetterVectorDrawable insieme al convertitore da SVG a VectorDrawable .

BetterVectorDrawable è l'implementazione VectorDrawable per Android 4.0+ con comportamento fallback configurabile su Android 5.0+.

Convertitore da SVG a VectorDrawable è il convertitore batch di immagini SVG in file di risorse XML Android VectorDrawable. Versione online

I collegamenti puntano a readmes, che forniscono informazioni sufficienti su come utilizzare lib e convertitore.


2

Al momento non ci sono VectorDrawable nella libreria di supporto.

Funkystein ha ragione: VectorDrawable è simile a SVG, supporta solo le funzionalità di disegno vettoriale più richieste in modo che Android possa concentrarsi sulle prestazioni. pathData, ad esempio, ha lo stesso formato della stringa "d" di SVG.


Quindi questo sarà rilevante solo quando Lollipop diventerà abbastanza popolare, e anche allora, non fornisce molte funzionalità. :(
sviluppatore Android

Conosci qualche tutorial / campione / video delle nuove API vettoriali?
sviluppatore Android


1

La grande notizia è che Google ha rilasciato la libreria di supporto Android 23.2 Support Vector Drawables e Animated Vector Drawables!

Ma grazie alle persone che hanno portato questa libreria prima di Google!

È qui che le librerie AppCompat sono fantastiche, possono riportare molte delle nuove funzionalità di Android a versioni molto precedenti. Con la nuova classe VectorDrawable, gli sviluppatori possono ora utilizzare immagini vettoriali fino all'API 7 (Android 2.1 Eclair). I vettori animati sono un po 'più limitati, risalgono solo all'API 11 (Android 3.0 Honeycomb), ma questo comprende ancora oltre il 97% dei dispositivi attualmente in uso

Guida all'uso:

Fare riferimento a " age-of-the-vectors " di @chrisbanes


1
Bello! puoi condividere alcuni esempi / tutorial su come utilizzare l'API dei vettori della nuova libreria di supporto?
sviluppatore Android

Sicuro ! l'ho già aggiunto alla mia lista delle cose da fare del weekend! :)
LOG_TAG

1
Grazie. Se è breve, scrivi anche qui.
sviluppatore Android
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.