Vector Drawable: qué es, formato XML y cómo funciona

Autor: IT Sectr Publicado: 2026-06-12 Tiempo de lectura: 9 min

Vector Drawable es un formato de gráficos vectoriales para Android basado en XML que permite crear imágenes escalables sin pérdida de calidad. A diferencia de PNG y JPEG, los vectores almacenan contornos geométricos y rellenos como instrucciones de texto, lo que proporciona un tamaño de archivo mínimo y adaptación a cualquier densidad de pantalla. Según la documentación de Android Developers (2026), Vector Drawable reduce el tamaño del APK en un promedio de 40–60% en comparación con un conjunto de recursos rasterizados para diferentes resoluciones.

Puntos clave

  • Vector Drawable es un formato de gráficos vectoriales de Android basado en XML, estandarizado desde API 21
  • Escalado sin pérdida de calidad: los vectores se adaptan a cualquier densidad de pantalla (mdpi, hdpi, xhdpi y superiores)
  • Tamaño del APK se reduce entre 40–60% al reemplazar múltiples archivos PNG por un solo archivo XML
  • Animación compatible mediante AnimatedVectorDrawable y AnimatedStateListDrawable
  • Adaptación al tema oscuro mediante el atributo android:theme sin duplicar recursos

¿Qué es Vector Drawable?

Vector Drawable es un recurso de Android que representa una imagen vectorial en formato XML, basado en la especificación SVG (Scalable Vector Graphics). Google introdujo este formato en Android 5.0 (API 21) como alternativa a las imágenes rasterizadas para iconos, ilustraciones y otros elementos gráficos de la interfaz.

A diferencia de PNG, donde la imagen se almacena como una matriz de píxeles de tamaño fijo, Vector Drawable describe las formas matemáticamente, mediante coordenadas de puntos, curvas Bezier, rellenos y trazos. Esto significa que una sola imagen vectorial puede reemplazar hasta seis archivos PNG para diferentes densidades de pantalla (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi), simplificando drásticamente el mantenimiento de los recursos gráficos.

El formato admite no solo imágenes estáticas, sino también animaciones mediante AnimatedVectorDrawable, así como adaptación al tema oscuro y colores personalizados a través de atributos de tema. Desde Android 7.0 (API 24), Vector Drawable también admite rellenos degradados y operaciones complejas de recorte (clipPath), lo que amplía las posibilidades de diseño.

Componentes principales de Vector Drawable

Cada Vector Drawable contiene un elemento raíz vector con parámetros de ancho, alto y viewport (un sistema de coordenadas virtual donde se dibujan las formas). En su interior se encuentran grupos (group) y trazados (path), donde path define la geometría mediante una secuencia de comandos: M (moveTo), L (lineTo), C (cubicTo), Z (close) y otros. Cada path puede tener su propio fillColor y strokeColor, que pueden hacer referencia a recursos del tema.

Los elementos adicionales incluyen clip-path para recorte, gradient para transiciones degradadas y atributos de adaptación al tema oscuro mediante el atributo android:theme. Todos los colores en Vector Drawable pueden especificarse como referencias a atributos del tema (por ejemplo, ?attr/colorPrimary), lo que cambia la apariencia de los iconos al cambiar de tema sin duplicar recursos.

Formato Vector Drawable: estructura XML

El archivo XML de Vector Drawable se coloca en el directorio res/drawable/ y tiene un elemento raíz . En su interior puede haber elementos anidados para organizar la jerarquía y para describir contornos. Cada path contiene un atributo pathData: una cadena de comandos de dibujo en formato SVG.

xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">

    <path
        android:fillColor="@color/ic_launcher_background"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2z"
        android:strokeWidth="1"
        android:strokeColor="#333333"/>

</vector>

En el ejemplo se describe un círculo con radio de 10 unidades en un viewport de 24×24. El parámetro fillColor hace referencia a un recurso de color, mientras que strokeWidth y strokeColor definen el trazo. Las dimensiones width y height se especifican en dp, lo que garantiza un escalado correcto en pantallas con diferente densidad de píxeles sin transformaciones adicionales.

Agrupación y transformaciones

El elemento group permite agrupar varios path y aplicarles transformaciones comunes: rotación (rotation), desplazamiento (translateX, translateY) y escalado (scaleX, scaleY). Los grupos pueden anidarse, lo que permite crear jerarquías complejas con cientos de elementos sin pérdida de rendimiento.

xml
<vector ...>
    <group android:name="arrow_group"
        android:pivotX="12"
        android:pivotY="12"
        android:rotation="90">
        <path .../>
    </group>
</vector>

La agrupación con el atributo pivotX/pivotY se utiliza para animación: se puede rotar o escalar una parte de la imagen independientemente de otros elementos, lo que es especialmente útil para crear iconos de estado animados (por ejemplo, carga → éxito).

Vector Drawable vs gráficos rasterizados

La elección entre gráficos vectoriales y rasterizados depende del caso de uso. Vector Drawable es ideal para iconos, ilustraciones y elementos de interfaz con pocos detalles, mientras que las fotos e imágenes complejas con miles de colores siguen siendo competencia de los formatos rasterizados.

ParámetroVector DrawablePNG
EscaladoSin pérdida de calidadPérdida al ampliar
Tamaño de archivo0.5–5 KB10–100 KB por resolución
Cantidad de archivos1 XML6 PNG (mdpi–xxxhdpi)
AnimaciónCompatibleSolo cambio de fotogramas
Adaptación de temaMediante ?attrConjuntos separados
Escenas complejasLimitadoCualquiera

Según Android Performance Patterns (Google I/O 2016), reemplazar iconos PNG por Vector Drawable reduce el tamaño del APK entre 40–60% en aplicaciones con una gran cantidad de recursos gráficos. Sin embargo, al renderizar vectores complejos con cientos de path, la carga de la CPU aumenta, por lo que para animaciones y redespliegues frecuentes se recomienda usar rasterizados previamente almacenados en caché.

Cuándo elegir Vector Drawable

Vector Drawable es óptimo para iconos de interfaz (barra de herramientas, navegación, estados), logotipos, ilustraciones simples y elementos animados. El formato es especialmente ventajoso cuando se admite múltiples pantallas: en lugar de generar PNG para seis densidades, basta con un solo archivo XML. Esto simplifica el mantenimiento del diseño y elimina errores de discrepancia de tamaños. Para fotos e imágenes con degradados fotorrealistas, todavía se utilizan formatos rasterizados con compresión WebP.

Animación de Vector Drawable

Android admite la animación de Vector Drawable mediante dos mecanismos: AnimatedVectorDrawable (disponible desde API 21) y AnimatedStateListDrawable. El primero permite animar atributos de path (rotación, desplazamiento, cambio de color y transformación de forma). El segundo cambia entre diferentes estados (presión, resaltado) con transiciones suaves.

AnimatedVectorDrawable utiliza tres archivos XML: el propio Vector Drawable, un ObjectAnimator que describe la animación y un AnimatedVectorDrawable de enlace que conecta el target (nombre del grupo o path) con el animator. La animación puede cambiar fillColor, strokeColor, rotation, translateX/Y, scaleX/Y e incluso pathData, transformando suavemente una forma en otra (morphing).

Ejemplo de animación morphing

Consideremos una animación donde un icono de «más» se convierte en un «aspa». La limitación principal: la cantidad de comandos pathData debe coincidir en el estado inicial y final; de lo contrario, la animación no funcionará.

xml
<!-- res/drawable/anim_plus_to_close.xml -->
<animated-vector xmlns:android="...">
    <target
        android:name="plus_path"
        android:animation="@anim/plus_to_close"/>
</animated-vector>

El ObjectAnimator plus_to_close cambia la propiedad pathData de la forma original de «más» a la forma de «aspa» en 300 milisegundos. El sistema interpola automáticamente las coordenadas entre los dos conjuntos de comandos SVG. Este tipo de animación se usa ampliamente en Material Design para transiciones suaves de estados de botones e iconos.

Ejemplos de código Vector Drawable

Veamos un ejemplo completo de XML vectorial para un icono de flecha atrás con soporte de tema oscuro. El color se define mediante una referencia a un atributo del tema, lo que cambia automáticamente el color del icono al alternar entre tema claro y oscuro sin duplicar recursos.

xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="?attr/colorControlNormal">

    <group android:name="arrow">
        <path
            android:fillColor="@android:color/white"
            android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    </group>

</vector>

El parámetro android:tint con el valor ?attr/colorControlNormal aplica automáticamente el color del sistema de control: gris oscuro en tema claro, blanco en tema oscuro. El grupo llamado arrow permite animar este icono mediante AnimatedVectorDrawable.

Carga de Vector Drawable desde código

Para cargar programáticamente un Vector Drawable en Android se utiliza la clase AppCompatResources.getDrawable() o el método ContextCompat.getDrawable(). En proyectos modernos con Jetpack Compose, los Drawable rasterizados y vectoriales se cargan mediante painterResource, que determina automáticamente el formato del recurso.

kotlin
import androidx.appcompat.content.res.AppCompatResources

val vectorDrawable = AppCompatResources.getDrawable(
    context,
    R.drawable.ic_arrow_back
)

// Jetpack Compose
Icon(
    painter = painterResource(R.drawable.ic_arrow_back),
    contentDescription = "Back",
    tint = MaterialTheme.colorScheme.onSurface
)

Al usar AppCompatResources.getDrawable(), la biblioteca AppCompat selecciona automáticamente la versión correcta del drawable según el nivel de API: en dispositivos anteriores a Android 5.0 (API 21) puede usarse un fallback rasterizado; en dispositivos más nuevos se usa Vector Drawable. En Jetpack Compose, painterResource maneja esta compatibilidad automáticamente.

Preguntas frecuentes

¿Desde qué versión de Android es compatible Vector Drawable?

Vector Drawable es compatible de forma nativa desde Android 5.0 (API 21). Para versiones anteriores es necesario usar la biblioteca AppCompat (los recursos vectoriales funcionan a través de ella en dispositivos con API 7+). También se requiere el flag vectorDrawables.useSupportLibrary = true en build.gradle.

¿Se puede usar Vector Drawable en Jetpack Compose?

Sí, Jetpack Compose admite Vector Drawable mediante la función painterResource(). El componente Icon carga automáticamente el recurso vectorial desde res/drawable/ y aplica el tema Material para el tint. Los vectores se escalan sin pérdida de calidad a cualquier tamaño especificado mediante el parámetro modifier.

¿Cuál es la diferencia entre Vector Drawable y SVG?

SVG es un estándar web universal con un amplio conjunto de características (filtros, máscaras, estilos incrustados). Vector Drawable es una versión adaptada para Android con un subconjunto limitado de comandos SVG. Android no admite SVG directamente, solo Vector Drawable generado a partir de SVG mediante Android Studio Asset Studio.

¿Cómo convertir SVG a Vector Drawable?

La forma más sencilla es usar Android Studio: clic derecho en la carpeta drawable → New → Vector Asset → Import local SVG file. El estudio optimiza automáticamente el SVG y genera el XML Vector Drawable. Otra opción son los convertidores en línea como SVG2VectorDrawable o ShapeShifter, que admite exportación con animación.

¿Por qué no se muestra Vector Drawable en dispositivos antiguos?

El problema suele estar relacionado con la falta de soporte de AppCompat. Asegúrate de que en build.gradle esté establecido el flag vectorDrawables.useSupportLibrary = true y que se use AppCompatDelegate. También verifica que el Vector Drawable no contenga funcionalidades no disponibles en la versión utilizada de la biblioteca AppCompat.

Resumen

  • Vector Drawable es un formato de gráficos vectoriales de Android basado en XML, estandarizado desde API 21
  • Escalado sin pérdida de calidad: un archivo XML reemplaza seis imágenes rasterizadas para diferentes densidades
  • Tamaño del APK se reduce entre 40–60% al reemplazar iconos PNG por equivalentes vectoriales
  • Animación implementada mediante AnimatedVectorDrawable con soporte de morphing y cambio de color
  • Tema oscuro compatible mediante atributos ?attr/colorControlNormal y android:theme
  • AppCompat proporciona compatibilidad hacia atrás hasta Android 2.3 (API 7) mediante useSupportLibrary
  • Usa Vector Drawable para iconos y elementos de interfaz, PNG/WebP para imágenes fotorrealistas

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también