Recursos de elementos de diseño

Un recurso de elementos de diseño es un concepto general que hace referencia a un gráfico que se puede dibujar en la pantalla y que puedes obtener con APIs como getDrawable(int) o aplicar a otro recurso XML mediante atributos como android:drawable y android:icon. Existen varios tipos de elementos de diseño:

Archivo de mapa de bits
Es un archivo de gráficos de mapa de bits (PNG, WEBP, JPG o GIF). Crea un BitmapDrawable.
Archivo nine-patch
Es un archivo PNG con regiones expandibles que permiten que las imágenes cambien de tamaño según el contenido (.9.png). Crea un NinePatchDrawable.
Lista de capas
Es un elemento de diseño que administra un array de otros elementos de diseño. Estos elementos se dibujan en el orden del array: el elemento con el índice más grande se dibuja encima. Crea un LayerDrawable.
Lista de estados
Es un archivo en formato XML que hace referencia a distintos gráficos de mapa de bits para diferentes estados (por ejemplo, para usar otra imagen cuando se presiona un botón). Crea un StateListDrawable.
Lista de niveles
Es un archivo en formato XML que define un elemento de diseño capaz de administrar varios elementos de diseño alternativos, cada uno con un valor numérico máximo. Crea un LevelListDrawable.
Elemento de diseño de transición
Es un archivo en formato XML que define un elemento de diseño capaz de fundirse entre dos recursos de elementos de diseño. Crea un TransitionDrawable.
Elemento de diseño de inserción
Es un archivo en formato XML que define un elemento de diseño capaz de insertar otro elemento de diseño según una distancia específica. Resulta útil cuando una vista requiere un elemento de diseño de fondo de dimensiones inferiores a los límites reales de ella.
Elemento de diseño de recorte
Es un archivo en formato XML que define un elemento de diseño capaz de recortar otro elemento de diseño según el valor de nivel actual de este. Crea un ClipDrawable.
Elemento de diseño de escala
Es un archivo en formato XML que define un elemento de diseño capaz de cambiar el tamaño de otro elemento de diseño según su valor de nivel actual. Crea un ScaleDrawable
.
Elemento de diseño de forma
Es un archivo en formato XML que define una forma geométrica, con sus colores y gradientes. Crea un GradientDrawable.

Si deseas obtener información para crear un AnimationDrawable, consulta el documento Recursos de animación.

Nota: Un recurso de color también se puede usar como un elemento de diseño en XML. Por ejemplo, cuando creas un elemento de diseño de lista de estados, puedes hacer referencia a un recurso de color para el atributo android:drawable (android:drawable="@color/green").

Mapa de bits

Una imagen de mapa de bits. Android admite archivos de mapas de bits en los siguientes formatos: PNG (recomendable), WEBP (recomendable, requiere el nivel de API 17 o uno superior), JPG (aceptable) y GIF (no recomendable).

Puedes hacer referencia a un archivo de mapa de bits de forma directa con el nombre del archivo como ID del recurso o crear un ID de recurso de alias en XML.

Nota: Durante el proceso de compilación, la herramienta aapt podría optimizar automáticamente los archivos de mapa de bits mediante compresión de imágenes sin pérdida. Por ejemplo, un archivo PNG con color verdadero que no requiera más de 256 colores se podría convertir a un archivo PNG de 8 bits con una paleta de colores. De ese modo, se genera una imagen que tiene la misma calidad y que requiere menos memoria.

Por lo tanto, ten en cuenta que los objetos binarios de imagen de este directorio pueden cambiar durante la compilación. Si planeas leer una imagen como una secuencia de bits para convertirla en un mapa de bits, coloca tus imágenes en la carpeta res/raw/; no se optimizarán en esta ubicación.

Archivo de mapa de bits

Un archivo de mapa de bits es un archivo PNG, WEBP, JPG o GIF. Android crea un recurso Drawable para todos estos archivos cuando los guardas en el directorio res/drawable/.

ubicación del archivo:
res/drawable/filename.png (.png, .webp, .jpg o .gif)
El nombre del archivo es el ID de recurso
tipo de datos de recursos compilados:
Puntero de recursos a un BitmapDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
ejemplo:
Con una imagen guardada en res/drawable/myimage.png, este XML de diseño usa la imagen en una vista:
<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/myimage" />

El siguiente código de la aplicación obtiene la imagen como un Drawable:

Kotlin

val drawable: Drawable? = ResourcesCompat.getDrawable(resources, R.drawable.myimage, null)

Java

Resources res = getResources();
Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.myimage, null);
consulta también:

Mapa de bits XML

Un mapa de bits XML es un recurso definido en XML que apunta a un archivo de mapa de bits. Como resultado, se obtiene un alias para un archivo de mapa de bits sin procesar. El XML puede especificar propiedades adicionales para el mapa de bits, como interpolación y representación en mosaicos.

Nota: Puedes usar un elemento <bitmap> como campo secundario de un elemento <item>. Por ejemplo, cuando creas una lista de estados o lista de capas, puedes excluir el atributo android:drawable de un elemento <item> y anidar dentro de este un <bitmap> que defina el elemento de diseño.

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un BitmapDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:antialias=["true" | "false"]
    android:dither=["true" | "false"]
    android:filter=["true" | "false"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                      "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                      "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:mipMap=["true" | "false"]
    android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
elementos:
<bitmap>
Obligatorio. Define la fuente y las propiedades del mapa de bits.

Atributos:

xmlns:android
Cadena. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android". Esto solo es necesario si <bitmap> es el elemento raíz. No lo es cuando <bitmap> está anidado dentro de <item>.
android:src
Recurso de elementos de diseño. Obligatorio. Referencia a un recurso de elementos de diseño.
android:antialias
Booleano. Habilita o inhabilita el suavizado de contornos.
android:dither
Booleano. Habilita o inhabilita la interpolación del mapa de bits si este no tiene la misma configuración de píxeles que la pantalla, como un mapa de bits ARGB 8888 en una pantalla RGB 565.
android:filter
Booleano. Habilita o inhabilita el filtrado del mapa de bits. El filtrado se usa cuando se encoge o estira el mapa de bits para mejorar la apariencia.
android:gravity
Palabra clave. Define la gravedad del mapa de bits. La gravedad indica la ubicación en la que debe ir el elemento de diseño en su contenedor si el mapa de bits es más chico que el contenedor.

Debe ser uno o más de los siguientes valores constantes, separados por |:

ValorDescripción
top Dispone el objeto en la parte superior del contenedor, sin cambiar el tamaño.
bottom Dispone el objeto en la parte inferior del contenedor, sin cambiar el tamaño.
left Dispone el objeto en el extremo izquierdo del contenedor, sin cambiar el tamaño.
right Dispone el objeto en el extremo derecho del contenedor, sin cambiar el tamaño.
center_vertical Dispone el objeto en el centro vertical del contenedor, sin cambiar el tamaño.
fill_vertical Aumenta el tamaño vertical del objeto, si es necesario, para que cubra completamente al contenedor.
center_horizontal Dispone el objeto en el centro horizontal del contenedor, sin cambiar el tamaño.
fill_horizontal Aumenta el tamaño horizontal del objeto, si es necesario, para que cubra completamente al contenedor.
center Dispone el objeto en el centro del contenedor, tanto en el eje vertical como el horizontal (sin cambiar el tamaño).
fill Aumenta el tamaño horizontal y vertical del objeto, si es necesario, para que cubra completamente el contenedor. Es el valor predeterminado.
clip_vertical Opción adicional que se puede establecer para recortar el borde superior o inferior del campo secundario a los límites del contenedor. El recorte depende de la gravedad vertical: con un valor de gravedad "top" se recorta el borde inferior, con un valor "bottom" se recorta el borde superior y con un valor nulo se recortan ambos bordes.
clip_horizontal Opción adicional que se puede establecer para recortar el borde izquierdo o derecho del campo secundario a los límites del contenedor. El recorte depende de la gravedad horizontal: con un valor de gravedad "left" se recorta el borde derecho, con un valor "right" se recorta el borde izquierdo y con un valor nulo se recortan ambos bordes.
android:mipMap
Booleano. Habilita o inhabilita la sugerencia de mipmap. Consulta setHasMipMap() para obtener más información. El valor predeterminado es falso.
android:tileMode
Palabra clave. Define el modo mosaico. Cuando se habilita el modo mosaico, se repite el mapa de bits. En este modo, se ignora la gravedad.

Debe ser uno de los siguientes valores constantes:

ValorDescripción
disabled El mapa de bits no aparece en el modo mosaico. Este es el valor predeterminado.
clamp Replica el color del borde si el sombreador dibuja fuera de sus límites originales.
repeat Repite la imagen del sombreador horizontal y verticalmente.
mirror Repite la imagen del sombreador horizontal y verticalmente, y alterna imágenes duplicadas para que las imágenes adyacentes siempre encajen.
ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/icon"
    android:tileMode="repeat" />
consulta también:

Nine-patch

Un NinePatch es una imagen PNG en la cual puedes definir regiones expandibles que Android ajusta cuando el contenido dentro de la vista supera los límites de la imagen normal. Por lo general, uno asigna este tipo de imagen como el fondo de una vista que tiene al menos una dimensión establecida en "wrap_content".

Cuando la vista se amplía para adaptarse al contenido, la imagen nine-patch también se ajusta para coincidir con el tamaño de la vista. Como ejemplo del uso de una imagen nine-patch, podemos mencionar el fondo que usa el widget Button estándar de Android, que se debe estirar para que el texto (o la imagen) entre en el botón.

Como en los mapas de bits convencionales, puedes hacer referencia a un archivo nine-patch de forma directa o desde un recurso definido por XML.

Si deseas obtener toda la información para crear un archivo nine-patch con regiones expandibles, consulta Cómo crear mapas de bits de tamaño modificable (archivos 9-patch).

Archivo nine-patch

ubicación del archivo:
res/drawable/filename.9.png
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un NinePatchDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
ejemplo:
Con una imagen guardada en res/drawable/myninepatch.9.png, este XML de diseño usa el nine-patch en una vista:
<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/myninepatch" />
consulta también:

Nine-patch XML

Un nine-patch XML es un recurso definido en XML que apunta a un archivo nine-patch. El XML puede especificar la interpolación de una imagen.

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un NinePatchDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:dither=["true" | "false"] />
elementos:
<nine-patch>
Obligatorio. Define la fuente y las propiedades de nine-patch.

Atributos:

xmlns:android
Cadena. Obligatoria. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android".
android:src
Recurso de elementos de diseño. Obligatorio. Referencia a un archivo nine-patch.
android:dither
Booleano. Habilita o inhabilita la interpolación del mapa de bits si este no tiene la misma configuración de píxeles que la pantalla, como un mapa de bits ARGB 8888 en una pantalla RGB 565.
ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/myninepatch"
    android:dither="false" />

Lista de capas

Un LayerDrawable es un objeto de diseño que gestiona un array de otros elementos de diseño. Cada elemento de diseño de la lista se dibuja en el orden de la lista. El último elemento de diseño de la lista se dibuja encima.

Un elemento <item> representa a cada elemento de diseño dentro de un solo elemento <layer-list>.

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un LayerDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</layer-list>
elementos:
<layer-list>
Obligatorio. Debe ser el elemento raíz. Contiene uno o más elementos <item>.

Atributos:

xmlns:android
Cadena. Obligatoria. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android".
<item>
Define un elemento de diseño que se dispondrá en el elemento de diseño de capa, en una posición definida por los atributos. Tiene que ser un elemento secundario de un elemento <layer-list>. Acepta elementos <bitmap> secundarios.

Atributos:

android:drawable
Recurso de elementos de diseño. Obligatorio. Referencia a un recurso de elementos de diseño.
android:id
ID de recurso. Un ID de recurso único para este elemento de diseño. Si quieres crear un nuevo ID de recurso para este elemento, utiliza la forma: "@+id/name". El símbolo + indica que se creó como un ID nuevo. Puedes usar este identificador para obtener y modificar el elemento de diseño con View.findViewById() o Activity.findViewById().
android:top
Dimensión. Desplazamiento superior, como valor de dimensión o recurso de dimensión.
android:right
Dimensión. Desplazamiento del lado derecho, como valor de dimensión o recurso de dimensión.
android:bottom
Dimensión. El desplazamiento inferior, como valor de dimensión o recurso de dimensión.
android:left
Dimensión. Es el desplazamiento del lado izquierdo, como valor de dimensión o recurso de dimensión.

De forma predeterminada, todos los elementos de diseño se escalan para adaptarse al tamaño de la vista contenedora. Por lo tanto, si dispones tus imágenes en una lista de capas en distintas posiciones, es posible que aumente el tamaño de la vista y que algunas imágenes se adecuen según sea necesario.

Para evitar que los elementos se escalen en la lista, usa un elemento <bitmap> dentro del elemento <item> para especificar el elemento de diseño y definir la gravedad en un componente no escalable, como "center". Por ejemplo, el siguiente <item> define un elemento que se escala para adaptarse a la vista que lo contiene:

<item android:drawable="@drawable/image" />

Para evitar el ajuste de escala, en el siguiente ejemplo se usa un elemento <bitmap> con gravedad centrada:

<item>
  <bitmap android:src="@drawable/image"
          android:gravity="center" />
</item>
ejemplo:
Archivo en formato XML guardado en res/drawable/layers.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
      <bitmap android:src="@drawable/android_red"
        android:gravity="center" />
    </item>
    <item android:top="10dp" android:left="10dp">
      <bitmap android:src="@drawable/android_green"
        android:gravity="center" />
    </item>
    <item android:top="20dp" android:left="20dp">
      <bitmap android:src="@drawable/android_blue"
        android:gravity="center" />
    </item>
</layer-list>

En este ejemplo, se usa un elemento <bitmap> anidado para definir el recurso del elemento de diseño correspondiente a cada elemento con un valor de gravedad "center". Esto garantiza que ninguna de las imágenes se escale para adaptarse al tamaño del contenedor debido al cambio de tamaño ocasionado por las imágenes desplazadas.

Este XML de diseño aplica el elemento de diseño a una vista:

<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/layers" />

Como resultado, se obtiene una pila de imágenes con desplazamiento cada vez mayor:

consulta también:

Lista de estados

Un StateListDrawable es un objeto de diseño definido en XML que usa varias imágenes para representar el mismo gráfico, según el estado del objeto. Por ejemplo, el estado de un widget Button se puede presionar o enfocar, o puede no realizarse ninguna de esas acciones. Con un elemento de diseño de lista de estados, puedes proporcionar una imagen de fondo diferente para cada estado.

Puedes describir la lista de estados en un archivo en formato XML. Cada gráfico se representa a través de un elemento <item> dentro de un solo elemento <selector>. Cada <item> usa varios atributos para describir el estado en que se usa como gráfico del elemento de diseño.

Durante cada cambio de estado, se recorre de arriba abajo la lista de estados, y se utiliza el primer elemento que coincida con el estado actual. La selección no depende de la "mejor coincidencia", sino del primer elemento que cumple con los criterios mínimos del estado.

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un StateListDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize=["true" | "false"]
    android:dither=["true" | "false"]
    android:variablePadding=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_hovered=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_activated=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>
elementos:
<selector>
Obligatorio. Debe ser el elemento raíz. Contiene uno o más elementos <item>.

Atributos:

xmlns:android
Cadena. Obligatoria. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android".
android:constantSize
Booleano. Es verdadero si el tamaño interno informado del elemento de diseño permanece constante durante los cambios de estado (el tamaño es el valor máximo de todos los estados). Es falso si el tamaño varía según el estado actual. El valor predeterminado es falso.
android:dither
Booleano. Es verdadero para habilitar la interpolación del mapa de bits si este no tiene la misma configuración de píxeles que la pantalla (por ejemplo, un mapa de bits ARGB 8888 en una pantalla RGB 565). Es falso para inhabilitar la interpolación. El valor predeterminado es verdadero.
android:variablePadding
Booleano. Es verdadero si el padding del elemento de diseño cambia según el estado seleccionado. Es falso si el padding debe permanecer igual, según el padding máximo de todos los estados. Si habilitas esta funcionalidad, deberás realizar tareas de diseño cuando cambie el estado (a menudo, esto no es posible). El valor predeterminado es falso.
<item>
Define un elemento de diseño que se usará en ciertos estados, según sus atributos. Tiene que ser un elemento secundario de un elemento <selector>.

Atributos:

android:drawable
Recurso de elementos de diseño. Obligatorio. Referencia a un recurso de elementos de diseño.
android:state_pressed
Booleano. Es verdadero si se usa este elemento cuando el objeto está presionado, como cuando se toca un botón. Es falso si se usa este elemento en el estado predeterminado, sin presionar.
android:state_focused
Booleano. Es verdadero si se usa este elemento cuando el objeto tiene foco de entrada, como cuando el usuario selecciona una entrada de texto. Es falso si se usa este elemento en el estado predeterminado, no enfocado.
android:state_hovered
Booleano. Es verdadero si se usa este elemento cuando se coloca el cursor sobre el objeto. Es falso si se usa este elemento en el estado predeterminado, cuando el cursor no se coloca sobre el objeto. A menudo, este elemento de diseño será el mismo que el del estado "enfocado".

Se introdujo en el nivel de API 14.

android:state_selected
Booleano. Es verdadero si se usa este elemento cuando el objeto es la selección actual del usuario cuando se navega con un control de dirección, como cuando se navega por una lista con un pad direccional. Es falso si se usa este elemento cuando el objeto no está seleccionado.

El estado seleccionado se usa cuando android:state_focused no es suficiente, por ejemplo, cuando la vista de lista está enfocada y se selecciona un elemento de ella con un pad direccional.

android:state_checkable
Booleano. Es verdadero si se usa este elemento cuando se puede seleccionar el objeto. Es falso si se usa este elemento cuando no se puede seleccionar el objeto. Solo es útil si el objeto puede hacer la transición entre un widget que se puede seleccionar y uno que no.
android:state_checked
Booleano. Es verdadero si se usa este elemento cuando el objeto está seleccionado. Es falso si se usa cuando el objeto no está seleccionado.
android:state_enabled
Booleano. Es verdadero si se usa este elemento cuando el objeto está habilitado, es decir, cuando es capaz de recibir eventos táctiles o de clics. Es falso si se usa cuando el objeto está inhabilitado.
android:state_activated
Booleano. Es verdadero si se usa este elemento cuando el objeto está activado como la selección persistente, por ejemplo, para "destacar" el elemento de lista previamente seleccionado en una vista de navegación persistente. Es falso si se usa cuando el objeto no está activado.

Se introdujo en el nivel de API 11.

android:state_window_focused
Booleano. Es verdadero si se usa este elemento cuando la ventana de la aplicación está enfocada, lo que significa que la aplicación está en primer plano. Es falso si se usa este elemento cuando la ventana de la aplicación no está enfocada, por ejemplo, si se abre el panel de notificaciones o aparece un diálogo.

Nota: Android aplica el primer elemento de la lista de estados que coincida con el estado actual del objeto. Así, si el primer elemento de la lista no contiene ninguno de los atributos de estado anteriores, se aplicará cada vez. Por eso, el valor predeterminado siempre debe ser el último, como se muestra en el siguiente ejemplo.

ejemplo:
Archivo en formato XML guardado en res/drawable/button.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/button_pressed" /> <!-- pressed -->
    <item android:state_focused="true"
          android:drawable="@drawable/button_focused" /> <!-- focused -->
    <item android:state_hovered="true"
          android:drawable="@drawable/button_focused" /> <!-- hovered -->
    <item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>

Este XML de diseño aplica el elemento de diseño de lista de estados a un botón:

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button" />
consulta también:

Lista de niveles

Es un elemento de diseño capaz de administrar varios elementos de diseño alternativos (cada uno con un valor numérico máximo). Si se fija el valor del nivel de un elemento de diseño con setLevel(), se cargará el recurso de elementos de diseño en la lista de niveles cuyo valor android:maxLevel sea superior o igual al valor pasado al método.

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un LevelListDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<level-list
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/drawable_resource"
        android:maxLevel="integer"
        android:minLevel="integer" />
</level-list>
elementos:
<level-list>
Obligatorio. Debe ser el elemento raíz. Contiene uno o más elementos <item>.

Atributos:

xmlns:android
Cadena. Obligatoria. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android".
<item>
Define un elemento de diseño que se usará a cierto nivel.

Atributos:

android:drawable
Recurso de elementos de diseño. Obligatorio. Referencia a un recurso de elementos de diseño que se insertará.
android:maxLevel
Entero. Es el nivel máximo permitido para este elemento.
android:minLevel
Entero. Es el nivel mínimo permitido para este elemento.
ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/status_off"
        android:maxLevel="0" />
    <item
        android:drawable="@drawable/status_on"
        android:maxLevel="1" />
</level-list>

Una vez aplicado en una View, el nivel se puede cambiar con setLevel() o setImageLevel().

consulta también:

Elemento de diseño de transición

Un TransitionDrawable es un objeto de diseño capaz de fundirse entre otros dos recursos de elementos de diseño.

Un elemento <item> representa a cada elemento de diseño dentro de un solo elemento <transition>. No se admiten más de dos elementos. Para realizar una transición hacia adelante, llama a startTransition(). Para realizar una transición hacia atrás, llama a reverseTransition().

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un TransitionDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</transition>
elementos:
<transition>
Obligatorio. Debe ser el elemento raíz. Contiene uno o más elementos <item>.

Atributos:

xmlns:android
Cadena. Obligatoria. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android".
<item>
Define un elemento de diseño que se usará como parte de la transición del elemento de diseño. Tiene que ser un elemento secundario de un elemento <transition>. Acepta elementos <bitmap> secundarios.

Atributos:

android:drawable
Recurso de elementos de diseño. Obligatorio. Referencia a un recurso de elementos de diseño.
android:id
ID de recurso. Un ID de recurso único para este elemento de diseño. Si quieres crear un nuevo ID de recurso para este elemento, utiliza la forma: "@+id/name". El símbolo + indica que se creó como un ID nuevo. Puedes usar este identificador para obtener y modificar el elemento de diseño con View.findViewById() o Activity.findViewById().
android:top
Entero. Desplazamiento superior en píxeles.
android:right
Entero. Desplazamiento del lado derecho en píxeles.
android:bottom
Entero. Desplazamiento inferior en píxeles.
android:left
Entero. Desplazamiento del lado izquierdo en píxeles.
ejemplo:
Archivo en formato XML guardado en res/drawable/transition.xml:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/on" />
    <item android:drawable="@drawable/off" />
</transition>

Este XML de diseño aplica el elemento de diseño a una vista:

<ImageButton
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/transition" />

Y el siguiente código realiza una transición de 500 ms del primer elemento al segundo:

Kotlin

val button: ImageButton = findViewById(R.id.button)
val drawable: Drawable = button.drawable
if (drawable is TransitionDrawable) {
    drawable.startTransition(500)
}

Java

ImageButton button = (ImageButton) findViewById(R.id.button);
Drawable drawable = button.getDrawable();
if (drawable instanceof TransitionDrawable) {
    ((TransitionDrawable) drawable).startTransition(500);
}
consulta también:

Elemento de diseño de inserción

Elemento de diseño definido en XML que inserta otro elemento de diseño en una distancia específica. Resulta útil cuando una vista requiere un fondo de dimensiones inferiores a los límites reales de ella.

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un InsetDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<inset
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:insetTop="dimension"
    android:insetRight="dimension"
    android:insetBottom="dimension"
    android:insetLeft="dimension" />
elementos:
<inset>
Obligatorio. Define el elemento de diseño de inserción. Debe ser el elemento raíz.

Atributos:

xmlns:android
Cadena. Obligatoria. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android".
android:drawable
Recurso de elementos de diseño. Obligatorio. Referencia a un recurso de elementos de diseño que se insertará.
android:insetTop
Dimensión. Es la inserción superior, como valor de dimensión o recurso de dimensión.
android:insetRight
Dimensión. Es la inserción del lado derecho, como valor de dimensión o recurso de dimensión.
android:insetBottom
Dimensión. Es la inserción inferior, como valor de dimensión o recurso de dimensión.
android:insetLeft
Dimensión. Es la inserción del lado izquierdo, como valor de dimensión o recurso de dimensión.
ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/background"
    android:insetTop="10dp"
    android:insetLeft="10dp" />
consulta también:

Elemento de diseño de recorte

Es un elemento de diseño definido en XML que recorta otro elemento de diseño según el nivel actual de este elemento de diseño. Puedes controlar el nivel de recorte del elemento de diseño secundario a lo ancho y alto según el nivel, y también un valor de gravedad para controlar la ubicación en el contenedor. Por lo general, se usa para implementar componentes como barras de progreso.

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un ClipDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<clip
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:clipOrientation=["horizontal" | "vertical"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                     "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                     "center" | "fill" | "clip_vertical" | "clip_horizontal"] />
elementos:
<clip>
Obligatorio. Define el elemento de diseño de recorte. Debe ser el elemento raíz.

Atributos:

xmlns:android
Cadena. Obligatoria. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android".
android:drawable
Recurso de elementos de diseño. Obligatorio. Referencia a un recurso de elementos de diseño que se recortará.
android:clipOrientation
Palabra clave. La orientación del recorte.

Debe ser uno de los siguientes valores constantes:

ValorDescripción
horizontal Recorta el elemento de diseño horizontalmente.
vertical Recorta el elemento de diseño verticalmente.
android:gravity
Palabra clave. Especifica el lugar de recorte dentro del elemento de diseño.

Debe ser uno o más de los siguientes valores constantes, separados por |:

ValorDescripción
top Dispone el objeto en la parte superior del contenedor, sin cambiar el tamaño. Cuando clipOrientation es "vertical", el recorte se realiza en la parte inferior del elemento de diseño.
bottom Dispone el objeto en la parte inferior del contenedor, sin cambiar el tamaño. Cuando clipOrientation es "vertical", el recorte se realiza en la parte superior del elemento de diseño.
left Dispone el objeto en el extremo izquierdo del contenedor, sin cambiar el tamaño. Es el valor predeterminado. Cuando clipOrientation es "horizontal", el recorte se realiza en el lateral derecho del elemento de diseño.
right Dispone el objeto en el extremo derecho del contenedor, sin cambiar el tamaño. Cuando clipOrientation es "horizontal", el recorte se realiza en el lateral izquierdo del elemento de diseño.
center_vertical Dispone el objeto en el centro vertical del contenedor, sin cambiar el tamaño. El recorte funciona como el valor de gravedad "center".
fill_vertical Aumenta el tamaño vertical del objeto, si es necesario, para que cubra completamente al contenedor. Cuando clipOrientation es "vertical", no hay recorte porque el elemento de diseño cubre el espacio vertical (a menos que el nivel del elemento de diseño sea 0 y, por ello, este no sea visible).
center_horizontal Dispone el objeto en el centro horizontal del contenedor, sin cambiar el tamaño. El recorte funciona como el valor de gravedad "center".
fill_horizontal Aumenta el tamaño horizontal del objeto, si es necesario, para que cubra completamente al contenedor. Cuando clipOrientation es "horizontal", no hay recorte porque el elemento de diseño cubre el espacio horizontal (a menos que el nivel del elemento de diseño sea 0 y, por ello, este no sea visible).
center Dispone el objeto en el centro del contenedor, tanto en el eje vertical como el horizontal (sin cambiar el tamaño). Cuando clipOrientation es "horizontal", el recorte se aplica a la izquierda y a la derecha. Cuando clipOrientation sea "vertical", el recorte se aplicará en la parte superior e inferior.
fill Aumenta el tamaño horizontal y vertical del objeto, si es necesario, para que cubra completamente el contenedor. No habrá recorte porque el elemento de diseño cubre el espacio horizontal y vertical (a menos que el nivel del elemento de diseño sea 0 y, por ello, no visible).
clip_vertical Opción adicional que se puede establecer para recortar el borde superior o inferior del campo secundario a los límites del contenedor. El recorte depende de la gravedad vertical: con un valor de gravedad "top" se recorta el borde inferior, con un valor "bottom" se recorta el borde superior y con un valor nulo se recortan ambos bordes.
clip_horizontal Opción adicional que se puede establecer para recortar el borde izquierdo o derecho del campo secundario a los límites del contenedor. El recorte depende de la gravedad horizontal: con un valor de gravedad "left" se recorta el borde derecho, con un valor "right" se recorta el borde izquierdo y con un valor nulo se recortan ambos bordes.
ejemplo:
Archivo en formato XML guardado en res/drawable/clip.xml:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/android"
    android:clipOrientation="horizontal"
    android:gravity="left" />

El siguiente XML de diseño aplica el elemento de diseño de recorte a una vista:

<ImageView
    android:id="@+id/image"
    android:src="@drawable/clip"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

El siguiente código obtiene el elemento de diseño y aumenta el recorte para mostrar la imagen de manera progresiva:

Kotlin

val imageview: ImageView = findViewById(R.id.image)
val drawable: Drawable = imageview.background
if (drawable is ClipDrawable) {
    drawable.level = drawable.level + 1000
}

Java

ImageView imageview = (ImageView) findViewById(R.id.image);
Drawable drawable = imageview.getBackground();
if (drawable instanceof ClipDrawable) {
    ((ClipDrawable)drawable).setLevel(drawable.getLevel() + 1000);
}

Si se aumenta el nivel, disminuye la cantidad de recorte y la imagen se muestra poco a poco. Aquí se muestra a un nivel de 7,000:

Nota: El nivel predeterminado es 0; la imagen está completamente recortada y no es visible. Cuando el nivel es 10,000, la imagen no se recorta y es completamente visible.

consulta también:

Elemento de diseño de escala

Un elemento de diseño definido en XML que cambia el tamaño de otro elemento de diseño según el nivel actual.

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un ScaleDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                          "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                          "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:scaleHeight="percentage"
    android:scaleWidth="percentage" />
elementos:
<scale>
Obligatorio. Define el elemento de diseño de escala. Debe ser el elemento raíz.

Atributos:

xmlns:android
Cadena. Obligatoria. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android".
android:drawable
Recurso de elementos de diseño. Obligatorio. Referencia a un recurso de elementos de diseño.
android:scaleGravity
Palabra clave. Especifica la posición de gravedad después del ajuste de escala.

Debe ser uno o más de los siguientes valores constantes, separados por |:

ValorDescripción
top Dispone el objeto en la parte superior del contenedor, sin cambiar el tamaño.
bottom Dispone el objeto en la parte inferior del contenedor, sin cambiar el tamaño.
left Dispone el objeto en el extremo izquierdo del contenedor, sin cambiar el tamaño. Es el valor predeterminado.
right Dispone el objeto en el extremo derecho del contenedor, sin cambiar el tamaño.
center_vertical Dispone el objeto en el centro vertical del contenedor, sin cambiar el tamaño.
fill_vertical Aumenta el tamaño vertical del objeto, si es necesario, para que cubra completamente al contenedor.
center_horizontal Dispone el objeto en el centro horizontal del contenedor, sin cambiar el tamaño.
fill_horizontal Aumenta el tamaño horizontal del objeto, si es necesario, para que cubra completamente al contenedor.
center Dispone el objeto en el centro del contenedor, tanto en el eje vertical como el horizontal (sin cambiar el tamaño).
fill Aumenta el tamaño horizontal y vertical del objeto, si es necesario, para que cubra completamente el contenedor.
clip_vertical Opción adicional que se puede establecer para recortar el borde superior o inferior del campo secundario a los límites del contenedor. El recorte depende de la gravedad vertical: con un valor de gravedad "top" se recorta el borde inferior, con un valor "bottom" se recorta el borde superior y con un valor nulo se recortan ambos bordes.
clip_horizontal Opción adicional que se puede establecer para recortar el borde izquierdo o derecho del campo secundario a los límites del contenedor. El recorte depende de la gravedad horizontal: con un valor de gravedad "left" se recorta el borde derecho, con un valor "right" se recorta el borde izquierdo y con un valor nulo se recortan ambos bordes.
android:scaleHeight
Porcentaje. Es la altura de la escala, expresada como porcentaje del límite del elemento de diseño. El formato del valor es XX%, como 100% o 12.5%.
android:scaleWidth
Porcentaje. Es el ancho de la escala, expresada como porcentaje del límite del elemento de diseño. El formato del valor es XX%, como 100% o 12.5%.
ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/logo"
    android:scaleGravity="center_vertical|center_horizontal"
    android:scaleHeight="80%"
    android:scaleWidth="80%" />
consulta también:

Elemento de diseño de forma

Se trata de una forma genérica definida en XML.

ubicación del archivo:
res/drawable/filename.xml
El nombre del archivo es el ID del recurso
tipo de datos de recursos compilados:
Puntero de recursos a un GradientDrawable
referencia del recurso:
En Java: R.drawable.filename
En XML: @[package:]drawable/filename
sintaxis:
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape=["rectangle" | "oval" | "line" | "ring"] >
    <corners
        android:radius="integer"
        android:topLeftRadius="integer"
        android:topRightRadius="integer"
        android:bottomLeftRadius="integer"
        android:bottomRightRadius="integer" />
    <gradient
        android:angle="integer"
        android:centerX="float"
        android:centerY="float"
        android:centerColor="integer"
        android:endColor="color"
        android:gradientRadius="integer"
        android:startColor="color"
        android:type=["linear" | "radial" | "sweep"]
        android:useLevel=["true" | "false"] />
    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer" />
    <size
        android:width="integer"
        android:height="integer" />
    <solid
        android:color="color" />
    <stroke
        android:width="integer"
        android:color="color"
        android:dashWidth="integer"
        android:dashGap="integer" />
</shape>
elementos:
<shape>
Obligatorio. Es el elemento de diseño de forma. Debe ser el elemento raíz.

Atributos:

xmlns:android
Cadena. Obligatoria. Define el espacio de nombres XML, que debe ser "http://schemas.android.com/apk/res/android".
android:shape
Palabra clave. Define el tipo de forma. A continuación, se indican los valores válidos:
ValorDescripción
"rectangle" Es un rectángulo que cubre la vista contenedora. Es la forma predeterminada.
"oval" Es una forma ovalada que cubre las dimensiones de la vista contenedora.
"line" Es una línea horizontal que se extiende a lo ancho de la vista contenedora. Esta forma requiere el elemento <stroke> para definir el espesor de la línea.
"ring" Forma de anillo.

Los siguientes atributos solo se usan cuando android:shape="ring":

android:innerRadius
Dimensión. Radio de la parte interna del anillo (el orificio del centro), como valor de dimensión o recurso de dimensión.
android:innerRadiusRatio
Flotante. Radio de la parte interna del anillo, expresado como proporción del ancho del anillo. Por ejemplo, si android:innerRadiusRatio="5", el radio interno es igual al ancho del anillo dividido por 5. android:innerRadius anula este valor. El valor predeterminado es 9.
android:thickness
Dimensión. Espesor del anillo, como valor de dimensión o recurso de dimensión.
android:thicknessRatio
Número de punto flotante. Es el espesor del anillo, expresado como proporción del ancho del anillo. Por ejemplo, si android:thicknessRatio="2", el espesor es igual al ancho del anillo dividido por 2. android:innerRadius anula este valor. El valor predeterminado es 3.
android:useLevel
Booleano. Es verdadero si se usa como un LevelListDrawable. Por lo general, es falso. De lo contrario, es posible que la forma no aparezca.
<corners>
Genera esquinas redondeadas en la forma. Solo servirá si la forma es un rectángulo.

Atributos:

android:radius
Dimensión. Radio de todas las esquinas, como valor de dimensión o recurso de dimensión. Los atributos siguientes lo anulan en cada esquina.
android:topLeftRadius
Dimensión. Radio de la esquina superior izquierda, como valor de dimensión o recurso de dimensión.
android:topRightRadius
Dimensión. Radio de la esquina superior derecha, como valor de dimensión o recurso de dimensión.
android:bottomLeftRadius
Dimensión. Radio de la esquina inferior izquierda, como valor de dimensión o recurso de dimensión.
android:bottomRightRadius
Dimensión. Es el radio de la esquina inferior derecha, como valor de dimensión o recurso de dimensión.

Nota: En cada esquina, se debe proporcionar (inicialmente) un radio de esquina superior a 1. De lo contrario, las esquinas no se redondearán. Si deseas que no se redondeen determinadas esquinas, es posible usar android:radius como alternativa para fijar un radio de esquina predeterminado superior a 1. A continuación, debes anular cada esquina con los valores deseados y fijar en 0 ("0 dp") las esquinas redondeadas.

<gradient>
Especifica un color de gradiente para la forma.

Atributos:

android:angle
Entero. El ángulo del gradiente (en grados). De izquierda a derecha, 0. De abajo hacia arriba, 90. Debe ser un múltiplo de 45. El valor predeterminado es 0.
android:centerX
Número de punto flotante. Posición X relativa para el centro del gradiente ("0-1.0").
android:centerY
Flotante. Posición Y relativa del centro del gradiente ("0-1.0").
android:centerColor
Color. Color opcional entre el color inicial y final, como valor hexadecimal o recurso de color.
android:endColor
Color. Color final, como valor hexadecimal o recurso de color.
android:gradientRadius
Flotante. Radio del gradiente. Solo sirve cuando android:type="radial".
android:startColor
Color. Color inicial, como valor hexadecimal o recurso de color.
android:type
Palabra clave. Tipo de patrón del gradiente que se aplicará. A continuación, se indican los valores válidos:
ValorDescripción
"linear" Gradiente lineal. Es el valor predeterminado.
"radial" Gradiente radial. El color inicial es el color del centro.
"sweep" Gradiente con línea de barrido.
android:useLevel
Booleano. Es verdadero si se usa como un LevelListDrawable.
<padding>
Es el padding que se aplicará al elemento de la vista contenedora (se rellena la posición, no la forma, del contenido de la vista).

Atributos:

android:left
Dimensión. Relleno izquierdo, como valor de dimensión o recurso de dimensión.
android:top
Dimensión. Relleno superior, como valor de dimensión o recurso de dimensión.
android:right
Dimensión. Relleno derecho, como valor de dimensión o recurso de dimensión.
android:bottom
Dimensión. Relleno inferior, como valor de dimensión o recurso de dimensión.
<size>
Es el tamaño de la forma.

Atributos:

android:height
Dimensión. Altura de la forma, como valor de dimensión o recurso de dimensión.
android:width
Dimensión. Es el ancho de la forma, como valor de dimensión o recurso de dimensión.

Nota: Según la configuración predeterminada, la forma se ajusta al tamaño de la vista contenedora en proporción a las dimensiones definidas aquí. Cuando usas la forma en una ImageView, puedes restringir el ajuste de escala fijando android:scaleType en "center".

<solid>
Es un color sólido para cubrir la forma.

Atributos:

android:color
Color. Color que se aplicará a la forma, como valor hexadecimal o recurso de color.
<stroke>
Es la línea de trazo para la forma.

Atributos:

android:width
Dimensión. Espesor de la línea, como valor de dimensión o recurso de dimensión.
android:color
Color. Color de la línea, como valor hexadecimal o recurso de color.
android:dashGap
Dimensión. Distancia entre los puntos de una línea, como valor de dimensión o recurso de dimensión. Solo servirá si se fija android:dashWidth.
android:dashWidth
Dimensión. Tamaño de cada línea de puntos, como valor de dimensión o recurso de dimensión. Solo servirá si se fija android:dashGap.
ejemplo:
Archivo en formato XML guardado en res/drawable/gradient_box.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#FFFF0000"
        android:endColor="#80FF00FF"
        android:angle="45"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="8dp" />
</shape>

Este XML de diseño aplica el elemento de diseño de forma a una vista:

<TextView
    android:background="@drawable/gradient_box"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

En este código de la aplicación, se obtiene el elemento de diseño de forma y se usa en una vista.

Kotlin

val shape: Drawable? = getDrawable(resources, R.drawable.gradient_box, getTheme())

val tv: TextView = findViewById(R.id.textview)
tv.background = shape

Java

Resources res = getResources();
Drawable shape = ResourcesCompat.getDrawable(res, R.drawable.gradient_box, getTheme());

TextView tv = (TextView)findViewById(R.id.textview);
tv.setBackground(shape);
consulta también: