Drawable

La clase Drawable es una abstracción que representa “algo que puede ser dibujado”. Esta clase se extiende para definir gran variedad de objetos gráficos más específicos. Muchos de ellos pueden ser definidos como recursos usando ficheros XML. Entre ellos tenemos los siguientes:

BitmapDrawable: Imagen basada en un fichero gráfico (PNG o JPG). Etiqueta XML <bitmap>.

VerctorDrawable: Igual que
ShapeDrawable, permite crear gráficos de forma vectorial. A diferencia de ShapeDrawable, podemos definir los gráficos en XML usando un formato basado en SVG (Scalable Vector Graphics). Este Drawable está disponible desde Android v5.0 (API 21), no obstante, se ha incluido en la librería de compatibilidad v7. Por lo tanto, podremos utilizarlo desde el API 7.

LayerDrawable: Contiene un array de
Drawable que se visualizan según el orden del array. El índice mayor del array es el que se representa encima. Cada Drawable puede situarse en una posición determinada. Etiqueta XML <layer-list>.

StateListDrawable: Similar al anterior pero ahora podemos usar una máscara de bits podemos seleccionar los objetos visibles. Etiqueta XML <selector>.

GradientDrawable: Degradado de color que puede ser usado en botones o fondos. Etiqueta XML <gradient>.

TransitionDrawable: Una extensión de LayerDrawables que permite un efecto de fundido entre la primera y la segunda capa. Para iniciar la transición hay que llamar a startTransition(inttiempo). Para visualizar la primera capa hay que llamar a resetTransition(). Etiqueta XML<transition>.

ShapeDrawable: Permite realizar un gráfico a partir de primitivas vectoriales, como formas básicas (círculos, cuadrados…) o trazados (Path). Etiqueta XML <shape>. Crear un ShapeDrawable desde XML está muy limitado. Las opciones de dibujo se limitan a círculos o cuadrados. Para realizar un gráfico más complejo hemos de usar la clase
Path, opción solo posible desde código.
 

AnimationDrawable: Permite crear animaciones frame a frame a partir de una serie de objetosDrawable. Etiqueta XML <animation-list>

También puede ser interesante que uses la clase Drawable o uno de sus descendientes como base para crear tus propias clases gráficas.

Además de ser dibujada, la clase Drawable proporciona una serie de mecanismos genéricos que permiten indicar como ha de ser dibujada. No todo Drawable ha de implementar todos los mecanismos. Veamos los más importantes:

El método setBounds(x1,y1,x2,y2) permite indicar el rectángulo donde ha de ser dibujado. Todo Drawable debe respetar el tamaño solicitado por el cliente, es decir, ha de permitir el escalado. Podemos consultar el tamaño preferido de un Drawable mediante los métodosgetIntrinsicHeight() y getIntrinsicWidth().

El método getPadding(Rect) proporciona información sobre los márgenes recomendados para representar contenidos. Por ejemplo, un Drawable que intente ser un marco para un botón, debe devolver los márgenes correctos para localizar las etiquetas, u otros contenidos, en el interior del botón.

El método setState(int[]) permite indicar al Drawable en qué estado ha de ser dibujado, por ejemplo "con foco", "seleccionado", etc. Algunos Drawable cambiarán su representación según este estado.

El método setLevel(int) algunos  Drawable  tienen un nivel asociado. Con este método podemos cambiarlo. Por ejemplo, un nivel puede ser interpretado como una batería de niveles o un nivel de progreso. Algunos Drawable modificarán la imagen basándose en el nivel.

Un drawable puede realizar animaciones al ser llamado desde ela interfaz Drawable.Callback. Tras implementar esta intefaz, hay que registrar un objeto de la clase creada llamando a setCallback(Drawable.Callback)).

Puedes ver algunos aspectos relacionados en formato poli[Media]

 La clase drawable  en Android
Preguntas de repaso: La clase Drawable en Android

Existen varias alternativas para crear una instancia de Drawable. Puedes crearla a partir de un fichero de imagen almacenado en los recursos del proyecto, también puedes crearla a partir del diseño basado en XML o puedes crearla a partir de código.

Veremos con más detalle algunas de las subclases de Drawable, más adelante.