VectorDrawable: ¿está disponible de alguna manera para las versiones anteriores a Lollipop de Android? [cerrado]

87

Antecedentes

He notado que Android ahora admite algún tipo de dibujo vectorial, a través de una clase llamada " VectorDrawable " (y también AnimatedVectorDrawable , BTW). Lo descubrí mirando las novedades de Android-Studio .

Me pregunto si esto sería el fin de tener que poner varios archivos en varias carpetas ( mdpi, hdpi, xhdpi, etc.). Eso sería genial y podría minimizar el tamaño de las aplicaciones en algunos casos.

Las preguntas

Me gustaría hacer algunas preguntas sobre esta nueva clase:

  1. ¿Es posible usarlo en versiones anteriores de Android, tal vez a través de una biblioteca incluso de la biblioteca de soporte de Google?

  2. No estoy familiarizado con su funcionamiento, pero ¿puede Lollipop manejar archivos SVG? ¿Puede hacer algo que se pueda lograr en archivos SVG?

  3. ¿Hay alguna muestra / tutorial / video de su uso, además de la documentación que encontré?

desarrollador de Android
fuente
3
Por lo que puedo ver, VectorDrawable es la androidificación de archivos SVG. Sin embargo, estoy usando SVG durante más de un año mediante el uso de bibliotecas de terceros . ( android-svg , svg-android y demás ). Hay otros con nombres similares. Cada uno se diferencia de los demás, así que elige con precisión según tus necesidades.
Phantômaxx
7
He creado una herramienta en línea para convertir SVG en un vector de recursos xml (solo lollipop) - inloop.github.io/svg2android - Todavía no se probó tanto en la versión alfa temprana. Admite archivos svg simples (como admite Android), lo he probado con inkscape: dibujé algunas formas (rect, círculo, espiral ...), seleccioné todo y luego "Ruta-> Objeto a ruta", exporté a * .svg y cayó en el sitio, generó xml y funciona bien.
Yuraj
1
@Yuraj ¡Vaya, es genial! buen trabajo ! Y en tan poco tiempo ... Toma, toma mi +1. :)
desarrollador de Android
Con respecto a inloop.github.io/svg2android ... Obtuves a very usefull tool but I un resultado incorrecto en tal caso y no sé qué está mal ... Hmmm, para una versión posterior, desearía que esta herramienta notificara sobre un formato incorrecto ... Si usé archivos svg puros con bibliotecas de terceros, todo está bien ...
Alex Zezekalo
@AlexZezekalo Deberías escribir sobre esto en su página web de Github: github.com/inloop/svg2android
desarrollador de Android

Respuestas:

39

ACTUALIZACIÓN Marzo de 2016

Mediante la actualización de Android Support Library 23.2.1 , admite elementos de diseño vectoriales y elementos de diseño animados de vectores (también puede usar latestone para lo mismo)

Actualice la versión de una biblioteca en el archivo gradle.

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

Los elementos de diseño vectoriales le permiten reemplazar varios activos png con un solo gráfico vectorial , definido en XML. Si bien limitado previamente a Lollipop y los dispositivos superiores , tanto VectorDrawabley AnimatedVectorDrawableahora están disponibles a través de dos nuevas bibliotecas Soporte de apoyo-vector-estirable y -vector-dibujable animada. nuevo app:srcCompatatributo para hacer referencia a elementos de diseño vectoriales.

Verifique la fuente en github con algunos ejemplos de muestra .

Cambios para la biblioteca appcompat v7:

Se revirtió la dependencia de los activos vectoriales para que los desarrolladores que usan la biblioteca appcompat no se vean obligados a usar VectorDrawablesus indicadores de compilación asociados.

Amit Vaghela
fuente
3
Acerca del soporte de vectores, ¿no es suficiente actualizar el complemento de gradle y usar "vectorDrawables.useSupportLibrary = true" dentro de "defaultConfig"?
desarrollador de Android
1
sí, para Gradle Plugin 2.0+ y para Gradle Plugin 1.5 necesitas agregar -> android {defaultConfig {generateDensities = []} // Esto lo maneja el complemento de Gradle 2.0+ aaptOptions {additionalParameters "--no-version -vectores "}}
Amit Vaghela
1
Además, muestre algún código aquí. Un enlace podría estar muerto algún día. Obtendrá +1 por este esfuerzo :)
desarrollador de Android
si por su puesto. publicará el código en poco tiempo en git y aquí.
Amit Vaghela
2
La compiledeclaración anterior implica que el proyecto utiliza lo RecyclerViewque no siempre es el caso.
razzledazzle
13

Actualización 2 : Lo habilitan nuevamente en la Biblioteca de soporte 23.4.0:

Para los usuarios de AppCompat, hemos agregado una API opt-in para volver a habilitar la compatibilidad con Vector Drawables de recursos (el comportamiento que se encuentra en 23.2) a través de AppCompatDelegate.setCompatVectorFromResourcesEnabled (verdadero): tenga en cuenta que esto aún puede causar problemas con el uso de la memoria y problemas al actualizar las instancias de configuración, por lo que está deshabilitado de forma predeterminada.

Compruebe este 23.4.0 disponible ahora

Actualización : esto no funciona desde la versión 23.3.0. Consulte aquí para obtener más detalles. Los elementos de diseño proxy no funcionan. app:srcCompaty setImageResource()trabajo, sin embargo.


La compatibilidad con Vector Drawable está disponible en la biblioteca de compatibilidad de la versión 23.2 y posteriores. Sin embargo, para usar correctamente esos elementos de diseño, se debe hacer referencia a ellos indirectamente.

El primer paso sería mejorar la AppCompatversión.

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

En segundo lugar, habilite el soporte Vector Drawable. Si usa el complemento de Gradle, 2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

De otra manera

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

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

En tercer lugar , consulte la respuesta vinculada .

Razzle Dazzle
fuente
sí, vi esto. Gracias por la información ampliada. Supongo que para todo el sistema (notificaciones, widgets, ...) esto, por supuesto, no está disponible ...
desarrollador de Android
Seguro que debería funcionar. Básicamente hace referencia a los dibujables a partir de ese momento. ¿Lo has probado? El ejemplo establece un dibujable vectorial en a MenuItem, que funciona bien.
razzledazzle
¿Estás seguro de que funcionará incluso para notificaciones y widgets? Estoy hablando de hacerlo funcionar en versiones antiguas de Android. ¿Cómo podrían manejar vectores para esto? No pueden usar la biblioteca de soporte, ¿no?
desarrollador de Android
El objetivo de usar la versión de la biblioteca de soporte es hacer que todo funcione en las versiones anteriores. Como está documentado, funciona desde API 7 y dibujables vectoriales animados desde API 11.
razzledazzle
Nuevamente, esto funciona dentro de la aplicación, pero ¿qué pasa si intentas usarlos afuera, como en notificaciones y widgets? No creo que funcione allí, porque no creo que puedas hacer que otras aplicaciones (lanzadores) usen la biblioteca de soporte, y mucho menos la barra de notificaciones. ¿Lo has probado?
desarrollador de Android
12

Puede probar esta biblioteca de soporte . Es compatible con VectorDrawable y AnimatedVectorDrawable introducido en Lollipop con compatibilidad total con versiones anteriores.

V_J
fuente
Esa biblioteca solo es compatible con API nivel 14 y superior, mientras que la biblioteca Mr Vector es compatible hasta 7+.
donturner
@donturner: Estoy de acuerdo con tu punto, pero no creo que los desarrolladores aún estén desarrollando aplicaciones para 7 API.
V_J
4
Quizás no API 7, pero definitivamente API 10 (Gingerbread), ya que representa el 4,1% del mercado de Android ( developer.android.com/about/dashboards/index.html ).
donturner
8

Para complementar algunas de las respuestas aquí: sí, puede obtener soporte para VectorDrawables pre-Lollipop , al menos parcial.

¿Qué tan parcial? Depende. He creado este diagrama para ayudar (válido para Support Library 23.4.0 hasta, al menos, 25.1.0).

Hoja de referencia dibujable

David Ferrand
fuente
De hecho, pero creo que si le permite generar automáticamente los archivos png, debería ser seguro
desarrollador de Android
1
Explicado de manera precisa.
Abhijit Kurane
Esta debería ser la respuesta aceptada. Gracias.
Justin Meiners
6

Desafortunadamente, en este momento VectorDrawable y AnimatedVectorDrawable no están disponibles en la biblioteca de soporte. Pero para aprovechar esta función en las versiones Pre-Lollipop, puede usar el backport no oficial llamado MrVector.

MrVector está disponible en Github y será compatible con las versiones de Android 7+.

Del Léame oficial

Para agregar la dependencia MrVector, agregue la siguiente línea a su bloque de dependencias build.gradle.

compile 'com.telly:mrvector:0.2.0'

Para crear el elemento de diseño a partir del vector XML,

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

Espero que esto ayude.

gnuanu
fuente
1
MrVector ha quedado obsoleto hace unos días a favor del próximo VectorDrawableCompat, que será parte de la biblioteca de soporte.
WindRider
Eso es realmente genial. Gracias por la info.
gnuanu
Sí, no puedo esperar para mejorar mi aplicación con algunos SVG gordos: D
WindRider
1
Obsoleto. Utilice este stackoverflow.com/a/30502261/1954675 en su lugar.
V_J
3

Si está utilizando VectorDrawable, Android Studio generará automáticamente archivos PNG de acuerdo (basados ​​en sus archivos XML) para las versiones Pre-Lollipop.

Tenga en cuenta que esos archivos PNG generados se consideran BitmapDrawables en lugar de VectorDrawables en dispositivos que ejecutan API por debajo de 21 y, por lo tanto, no se pueden animar o similar en esos dispositivos.

Consulte "compatibilidad con versiones anteriores" para obtener más detalles: http://android-developers.blogspot.co.at/2015/09/android-studio-14.html

Mehlyfication
fuente
Sí, fue publicado recientemente. Sin embargo, está usando PNG, en lugar de usar los vectores, por lo que si cambio el tamaño de imageView que contiene la imagen, estará pixelada / borrosa.
desarrollador de Android
Desarrollador de @android: Tiene parte de razón. Se producirá este comportamiento, pero sería el mismo para VectorDrawables. Cada VectorDrawable tiene un ancho y un alto definidos dentro de su XML (por ejemplo, vector_drawable.xml). Si este ancho / alto se establece en 50x50dp pero establece el tamaño de ImageView en 100x100dp, el resultado seguirá siendo borroso incluso si está ejecutando Android 5.0 (y por lo tanto está utilizando VectorDrawable en lugar de un BitmapDrawable generado automáticamente). El beneficio real de un VectorDrawable sobre un mapa de bits común es que tiene en cuenta los ppp de la pantalla y, por lo tanto, no se difumina incluso en pantallas de 4k.
Mehlyfication
¿Quiere decir que VectorDrawable no se muestra bien cuando se usa un tamaño que no estaba configurado para él? Pero es un contenido vectorizado ... ¿Por qué funcionaría de otra manera?
desarrollador de Android
¿Genera también png para elementos de diseño vectoriales animados?
Louis CAD
No, no creará archivos PNG para ese caso. Si desea animar el dibujo vectorial en dispositivos que ejecutan una versión de Android anterior a Android 5.0, puede probar VectorDrawableCompat: developer.android.com/reference/android/support/graphics/…
Mehlyfication
3

Lollipop no puede manejar archivos SVG sin bibliotecas de terceros.

La mejor solución que encontré es BetterVectorDrawable lib junto con SVG to VectorDrawable Converter .

BetterVectorDrawable es la implementación de VectorDrawable para Android 4.0+ con comportamiento alternativo configurable en Android 5.0+.

SVG to VectorDrawable Converter es el conversor por lotes de imágenes SVG a archivos de recursos XML VectorDrawable de Android. Versión en línea

Los enlaces apuntan a archivos Léame, que proporcionan suficiente información sobre cómo utilizar la biblioteca y el convertidor.

Un estudiante
fuente
2

No hay VectorDrawables en la biblioteca de soporte en este momento.

Funkystein tiene razón: VectorDrawable es similar a SVG, solo admite las funciones de dibujo vectorial que tienen mayor demanda para que Android pueda centrarse en el rendimiento. pathData, por ejemplo, tiene el mismo formato que la cadena "d" de SVG.

George Mount
fuente
Entonces esto será relevante solo cuando Lollipop se vuelva lo suficientemente popular, e incluso entonces, no brinda muchas funciones. :(
desarrollador de Android
¿Conoce algún tutorial / muestra / video de las nuevas API de vectores?
desarrollador de Android
2
Encontré uno ahora: blog.sqisland.com/2014/10/… , github.com/chiuki/animated-vector-drawable
desarrollador de Android
1

¡La gran noticia es que Google lanzó la biblioteca de soporte de Android 23.2 compatible con elementos de diseño vectoriales animados y elementos de diseño vectoriales animados!

¡Pero gracias a las personas que portaron esta biblioteca antes que Google!

Aquí es donde las bibliotecas de AppCompat son geniales, pueden traer muchas de las nuevas características de Android a versiones mucho más antiguas. Con la clase VectorDrawable recientemente implementada, los desarrolladores ahora pueden usar imágenes vectoriales desde API 7 (Android 2.1 Eclair). Los vectores animados son un poco más limitados, se remontan a API 11 (Android 3.0 Honeycomb), pero aún abarcan más del 97% de los dispositivos en uso activo en la actualidad.

Guía de uso:

Consulte la " edad de los vectores " por @chrisbanes

LOG_TAG
fuente
1
¡Agradable! ¿Puede compartir algunas muestras / tutoriales sobre cómo usar la API de vectores de la nueva biblioteca de soporte?
desarrollador de Android
Por supuesto ! ¡Ya lo agregué a mi lista de tareas del fin de semana! :)
LOG_TAG
1
Gracias. Si es breve, escriba también aquí.
desarrollador de Android