Conceptos y la implementación de Jetpack Compose
Android Studio incluye una herramienta llamada Vector Asset Studio que te ayuda a agregar íconos de Material y a importar archivos de gráficos vectoriales redimensionables (SVG) y de Adobe Photoshop Document (PSD) a tu proyecto como recursos de elementos de diseño vectoriales. El uso de elementos de diseño vectoriales en lugar de mapas de bits reduce el tamaño de tu APK porque se puede cambiar el tamaño del mismo archivo para diferentes densidades de pantalla sin perder la calidad de la imagen. Para versiones anteriores de Android que no admiten elementos de diseño vectoriales, Vector Asset Studio puede, durante el tiempo de compilación, convertir tus elementos de diseño vectoriales en diferentes tamaños de mapa de bits para cada densidad de pantalla.
Acerca de Vector Asset Studio
Vector Asset Studio agrega un gráfico vectorial al proyecto como un archivo XML que describe la imagen. Mantener un archivo XML puede ser más sencillo que actualizar varios gráficos de trama en distintas resoluciones.
Android 4.4 (nivel de API 20) y las versiones anteriores no admiten elementos de diseño vectoriales. Si tu nivel mínimo de API se fija en uno de estos valores, tienes dos opciones al usar Vector Asset Studio: generar archivos de Portable Network Graphic (PNG) (predeterminada) o usar la técnica de compatibilidad con versiones anteriores en AndroidX.
Para ofrecer compatibilidad con versiones anteriores, Vector Asset Studio genera imágenes de trama del elemento de diseño vectorial. Los elementos de diseño de trama y vectoriales se empaquetan juntos en el APK. Puedes hacer referencia a los elementos de diseño vectoriales como Drawable en código Java o @drawable en código XML; cuando se ejecuta tu app, se muestra automáticamente la imagen de trama o vectorial correspondiente según el nivel de API.
Retrocompatibilidad en AndroidX
Esta técnica exige AndroidX 1.0 o versiones posteriores y un complemento de Android para Gradle 3.2 o versiones posteriores, y usa solo elementos de diseño vectoriales. La clase VectorDrawableCompat en AndroidX te permite admitir VectorDrawable en Android 2.1 (nivel de API 7) y versiones posteriores.
Antes de usar Vector Asset Studio, debes agregar una declaración a tu archivo build.gradle:
Groovy
android { defaultConfig { vectorDrawables.useSupportLibrary = true } } dependencies { implementation 'androidx.appcompat:appcompat:1.7.1' }
Kotlin
android { defaultConfig { vectorDrawables.useSupportLibrary = true } } dependencies { implementation("androidx.appcompat:appcompat:1.7.1") }
También debes usar técnicas de codificación de AndroidX para la retrocompatibilidad, como el uso del atributo app:srcCompat en lugar del atributo android:src para elementos de diseño vectoriales. Para obtener más información, consulta AndroidX.
Cómo agregar un elemento de diseño vectorial a un diseño
En un archivo de diseño, puedes configurar cualquier widget relacionado con el ícono, como ImageButton, ImageView, etcétera, para señalar un elemento de diseño vectorial.
Por ejemplo, en el siguiente diseño, aparece un elemento de diseño vectorial que se muestra en un botón:
Figura 1. Elemento de diseño vectorial que se muestra en un botón de un diseño
Para mostrar un elemento de diseño vectorial en un widget, como en la figura, haz lo siguiente:
Abre un proyecto e importa un elemento de diseño vectorial.
En este ejemplo, se usa un proyecto para tablet o teléfono generado con el asistente de proyectos nuevos.
En la vista Android de la ventana Project, haz doble clic en un archivo XML de diseño, como
content_main.xml.Haz clic en la pestaña Design para mostrar el editor de diseño.
Arrastra el widget
ImageButtonde la ventana Palette al editor de diseño.En el diálogo Resources, selecciona Drawable en el panel izquierdo y, luego, el elemento de diseño vectorial que importaste. Haz clic en OK.
El elemento de diseño vectorial aparecerá en el
ImageButtondel diseño.Para cambiar el color de la imagen al color de los elementos destacados definido en el tema, en la ventana Properties, ubica la propiedad tint y haz clic en … .
En el diálogo Resources, selecciona Color en el panel izquierdo y, luego, colorAccent. Haz clic en OK.
El color de la imagen cambiará al color de énfasis en el diseño.
Si en el proyecto se usa AndroidX, el código ImageButton debe ser como el siguiente:
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/ic_build_black_24dp" tools:layout_editor_absoluteX="11dp" tools:layout_editor_absoluteY="225dp" android:id="@+id/imageButton" android:tint="@color/colorAccent" />
Si en el proyecto no se usa AndroidX, el código del elemento de diseño vectorial, en cambio, será android:src="@drawable/ic_build_black_24dp".
Cómo hacer referencia a un elemento de diseño vectorial en el código
Normalmente, puedes hacer referencia a un recurso de elemento de diseño vectorial de manera genérica en tu código y, cuando se ejecuta tu app, se muestra automáticamente la imagen vectorial o de trama correspondiente según el nivel de API:
En la mayoría de los casos, puedes hacer referencia a los elementos de diseño vectoriales como
@drawableen código XML oDrawableen código Java.Por ejemplo, el siguiente código XML de diseño aplica la imagen en una vista:
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/myimage" />
El siguiente código recupera la imagen como un
Drawable:Kotlin
val drawable = resources.getDrawable(R.drawable.myimage, theme)
Java
Resources res = getResources(); Drawable drawable = res.getDrawable(R.drawable.myimage, getTheme());
El método
getResources()reside en la claseContext, que se aplica a los objetos de IU, como actividades, fragmentos, diseños y vistas, entre otros.Si tu app usa AndroidX (incluso si no tienes una declaración
vectorDrawables.useSupportLibrary = trueen tu archivobuild.gradle), también puedes hacer referencia a un elemento de diseño vectorial con una declaraciónapp:srcCompat. Por ejemplo:<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" app:srcCompat="@drawable/myimage" />
En algunas ocasiones, es posible que debas encasillar el recurso de elementos de diseño en su clase exacta, como cuando debes usar funciones específicas de la clase
VectorDrawable. Para ello, puedes usar un código como el siguiente:Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val vectorDrawable = drawable as VectorDrawable } else { val bitmapDrawable = drawable as BitmapDrawable }
Java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { VectorDrawable vectorDrawable = (VectorDrawable) drawable; } else { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; }
Solo puedes acceder a los recursos de elementos de diseño vectoriales desde el subproceso principal.
Para Android 5.0 (nivel de API 21) y versiones posteriores, puedes usar la clase AnimatedVectorDrawable para animar las propiedades de la clase VectorDrawable. Con AndroidX, puedes usar la clase AnimatedVectorDrawableCompat para animar la clase VectorDrawable en Android 3.0 (nivel de API 11) y versiones posteriores. Para obtener más información, consulta Cómo animar gráficos con elementos de diseño.