vectordrawables usesupportlibrary studio compat java android android-layout vector

java - usesupportlibrary - ¿Cómo usar los dibujos vectoriales en la API de Android 21 inferior?



vector drawable android gradle (12)

Estoy trabajando en un proyecto de Android y elegí <vector> para mostrar el icono porque es adaptable y dinámicamente, sin embargo, solo puedo ejecutar esta aplicación en dispositivos con Android, que tienen API 21 o superior. Mi pregunta es cómo puedo usar <vector> en una versión inferior de Android, es decir, API 14 o más. ¡Gracias!

<!-- 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>`


¡Encontré la solución! Para aquellos que buscan una solución con TextView y otros atributos de espacio de nombres "android". En primer lugar, esto es necesario:

android { defaultConfig { vectorDrawables.useSupportLibrary = true } }

Y en la clase de aplicación, defina esto:

@Override public void onCreate() { super.onCreate(); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }

Ahora puede usar la app:srcCompat="@drawable/ic_add" pero si intenta usar android:background= o android:drawableLeft= se bloqueará la aplicación con la excepción "Error al inflar".

Podemos crear ic_add_wrapped.xml envuelto para este vector:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_add"/> </layer-list>

Y ahora funcionará con cualquier propiedad como drawableLeft o background. Simplemente configure android:drawableLeft="@drawable/ic_add_wrapped.xml" . ¡ADVERTENCIA! Esta es una solución alternativa. Entonces lo usa bajo su propio riesgo.


Con la biblioteca de soporte 23.2, el verdadero soporte para Vector Drawables se ha proporcionado hasta API v7. Se recomienda deshabilitar la versión anterior del soporte, que representaba PNG durante el tiempo de compilación, agregando

// Gradle Plugin 2.0+ android { defaultConfig { vectorDrawables.useSupportLibrary = true } }

al archivo build.gradle .

La implementación es bastante simple. Hay un nuevo atributo srcCompat en Drawables:

<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/ic_add" /> <= this is new

Los Drawables vectoriales también son compatibles en casos como la propiedad drawableLeft de TextView.

Fuente: anuncio de la biblioteca

Sin embargo, todavía recomendaría algo como la biblioteca Iconics , AndroidSVG u otra fuente de icono o solución SVG para soporte y soporte SVG completo.


Cuando necesite agregar VectorDrawable (creado a partir de SVG) mediante programación, puede hacerlo así:

icon = VectorDrawableCompat.create(resources, R.drawable.ic_map_black_24dp, null)


Los Vector Drawables ahora son compatibles con versiones anteriores, solo es cuestión de actualizar su versión gradle a 1.4.0-beta3 o superior, y actualizar su IDE:

También nos complace ofrecer compatibilidad con versiones anteriores para sus activos vectoriales en Android Studio 1.4. Una vez que tenga una imagen vectorialDrawable en su resolución / dibujable, el complemento Gradle generará automáticamente imágenes PNG ráster para el nivel de API 20 o inferior durante el tiempo de compilación. Esto significa que solo necesita actualizar y mantener su activo vectorial para su proyecto de aplicación y Android Studio puede encargarse del proceso de conversión de imágenes.

http://android-developers.blogspot.com.uy/2015/09/android-studio-14.html


Para versiones inferiores compatibles,

  1. agregue lo siguiente en gradle,

    android { defaultConfig { vectorDrawables.useSupportLibrary = true } }

  2. agregue el siguiente código en onCreate () en su clase de aplicación,

    @Override public void onCreate() { super.onCreate(); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }

  3. En xml para 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 desea cambiar la fuente de la imagen mediante programación, use esto,

    imageView.setImageResource(R.drawable.ic_launcher);


Puede usar programáticamente ... para establecer editText su editText o textView

me gusta

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()); }

Y a la izquierda dibujable así ...

editText.setCompoundDrawables( tick_drawable , null, null, null );



Solo para completar la respuesta de @ 2Dee:

VectorDrawable no se puede usar en API 20 y versiones inferiores. El método oficial genera pngs, que luego se convierten en BitmapDrawables, lo que rompe la idea de los gráficos vectoriales.

Personalmente prefiero svg''s sobre vectores xml:

  • tales gráficos se pueden exportar directamente desde Illustrator u otro software popular
  • svg admite transformaciones, texto, máscaras y otras cosas correctamente
  • verdaderos gráficos vectoriales escalables en todas las plataformas
  • tamaño más pequeño y construcciones más rápidas

Para usar gráficos vectoriales, puede probar AndroidSVG . Es un lector de svg e ImageView compatible con svg.


Tuve un problema en el que mis imágenes vectoriales aparecerían pero serían completamente negras, esto se debió a un problema en el que no puede hacer referencia a los recursos de color en el archivo xml del vector.

Entonces, en lugar de @color/primaryColorDark , debe usar el color real, por ejemplo, #212121


después de configurar vectorDrawables.useSupportLibrary = true en gradle default y AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); en actividad en crear

Para evitar bloquearse con Android: drawableleft en Textview , establezca drawble a la izquierda en la vista de texto programáticamente por ejemplo:

textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);


necesita usar Android Support Repository 30+ si usa android studio y necesita la biblioteca de soporte de Android 23.2.1+ si usa Eclipse.

verifique su build.gradle (proyecto) si usa la versión 2.0+ agregue el código siguiente en su build.gradle (aplicación)

// Gradle Plugin 2.0+ android { defaultConfig { vectorDrawables.useSupportLibrary = true } }

y: si usa la versión 1.5, agregue a continuación en su build.gradle (aplicación)

// Gradle Plugin 1.5 android { defaultConfig { generatedDensities = [] } // This is handled for you by the 2.0+ Gradle Plugin aaptOptions { additionalParameters "--no-version-vectors" } }

Aquí hay un código de muestra para usar el icono de vector:

<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/ic_add" tools:ignore="MissingPrefix" />

o

<ImageButton android:layout_width="wrap_content" android:background="@android:color/transparent" app:srcCompat="@drawable/camera" tools:ignore="MissingPrefix" android:layout_height="wrap_content"/>

Los Drawables vectoriales también son compatibles en casos como la propiedad drawableLeft de TextView. pero funcionó api 22+ para mí y todavía no sé cómo funcionará para api baja.

También tenga en cuenta si desea ser compatible con API 21:

  • no puede usar la propiedad android:background en xml o la función View.setBackgroundResource() . Necesita usar View.setBackground() .
  • no puede usar los svg-s en StateListDrawable xml-s u otros dibujables xml, debe generarlos mediante programación.
  • no puede usar svg-s en caso de notificaciones.

VectorDrawable se admite antes de Lollipop a través de la Biblioteca de soporte , pero la forma de usarlos depende de la versión de la Biblioteca de soporte que tenga. Y puede que no funcione en todos los casos.

He creado este diagrama para ayudar (válido para Support Library 23.4.0 a - al menos - 25.1.0).