Penúltimo capítulo de esta sección. Llegados este punto, ya hemos visto cómo crear una aplicación casi en su totalidad. Todos los puntos fuertes y necesarios los hemos recorrido a lo largo de estas semanas. Con este capítulo y el último, sólo me queda dar información adicional y comentar aquellos puntos secundarios que dan un valor añadido a nuestra aplicación, pues en un mercado donde hay tantas aplicaciones, lo más importante es destacar a través del valor añadido.

17. Animaciones

Lo primero de todo es darle vida a nuestra aplicación. Para ello podremos animar nuestras aplicaciones. Para ello, Android nos provee dos sistemas de animaciones:

  • Animación de propiedad (Introducido en Android 3.0 Honeycomb): Nos permite animar las propiedades de cualquier objeto, incluyendo aquellas que no son renderizadas en la pantalla. El sistema es extensible y nos permite animar las propiedades de tipos personalizados por nosotros mismos también.
  • Animación de vista: Sólo puede ser usada por objectos de la clase View. Es relativamente fácil configurar y ofrecer animaciones en ellas y dar un valor añadido a cada vista de nuestra pantalla.

Además de estos dos sistemas, hay un tercero llamado Animación de Drawable, que nos permite cargar recursos de nuestra carpeta drawable y mostrarlos de forma animada.

Pero pasemos a analizarlos un poco en más profundidad estos sistemas.

Con las animaciones de propiedad, podremos definir las siguientes características:

  • Duración de la animación (por defecto, 300ms)
  • Interpolación de tiempo
  • Número de repeticiones y comportamiento
  • Sets de animadores
  • Retardo de refresco de capa

Para ver cómo funciona este sistema, veamos un ejemplo.  A continuación podemos ver el ejemplo donde a un objeto le animamos su propiedad x, que representa su posición horizontal en la pantalla. La duración de la animación está establecida en 40ms y la distancia en 40 píxeles. Cada 10ms, que es la tasa de refresco por defecto, el objeto se mueve 10 píxeles horizontalmente. Tras 40ms, la animación para y el objeto acaba en la posición final, 40 píxeles desplazado. Es un ejemplo simple de interpolación lineal (velocidad constante)

También podemos tener interpolación no lineal. En el siguiente ejemplo vemos un caso similar pero con aceleración al principio y deceleración al final. El resultado es el mismo que el anterior, pero el proceso diferente.

 

Las clases principales que entran en juego para todo este sistema son las siguientes:

La clase ValueAnimator mantiene la información referente al tiempo, encapsulando un TimeInterpolator, que define la interpolación de la animación y un TypeEvaluator, que define cómo se calculan los valores que están siendo animados

Para empezar una animación, tendremos que crear un ValueAnimator y darle los valores iniciales y finales a la propiedad a animar. Para ello, cuando llamamos al método start la animación empezará. Durante toda la duración de la animación, el objeto ValueAnimator creado calculará la fración pasada entre 0 y 1, basado en la duración de la animación y el tiempo ya transcurrido, con lo que tendremos el tanto por uno de tiempo que la animación ha completado. Cuando éste ha calculado la fracción transcurrida, llama al TimeInterpolator que calcula la fracción interpolada. Tras esto, el ValueAnimator llama a TypeEvaluator para calcular el valor de la propiedad.

En las API Demos de Android, tenemos ejemplos sobre estas animaciones que podemos ver tanto en código como funcionando.

En lo que respecta a las animaciones de vista, podremos calcular animaciones en base a la posición, tamaño, rotación y transparencia de un objeto de la clase View. Para ello, le definimos una serie de instrucciones en un XML o programáticamente, aunque es recomendable tenerlo en XML. Para ello, utilizaremos las clases AnimationSet Animation. Todo ello irá en los recursos de nuestra aplicación, en la carpeta anim.

A continuación podemos ver un ejemplo:

Si el anterior código lo tenemos guardado en /res/anim/ como hyperspace_jump.xml, utilizarlo en una View de ejemplo sería tan fácil como:

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);

Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);

spaceshipImage.startAnimation(hyperspaceJumpAnimation);

Al igual que anteriormente, podemos determinar cómo se aplica la animación utilizando un Interpolator.

Como alternativa a startAnimation, podemos usar setStartTime/setAnimation.

Toda la información relativa a esto la podremos encontrar en los recursos de animaciones.

18. Widgets

Si algo diferencia especialmente a Android del resto de plataformas, es el sistema de Widgets que tiene implementado. Si echamos un ojo a nuestro teléfono móvil, veremos seguramente la cantidad de widgets que tenemos disponibles gracias a las aplicaciones que tenemos instaladas.

Pero, ¿qué es un widget? No es más que una aplicación en miniatura que puede ser incluida en otras aplicaciones y recibir actualizaciones periódicas, como por ejemplo la pantalla principal.

El mundo de los widgets es algo muy denso y que puede ser tan complejo como nuestro widget queramos que sea. A pesar de ello, he de decir que, desde mi punto de vista, los mejores widgets son aquellos muy simples pero con una funcionalidad muy bien definida, y es que no debemos olvidar que  un widgets es para algo rápido e instantáneo, no para meter toda la funcionalidad de una aplicación en una pantalla más pequeña.

Para crear un widget, necesitaremos a modo de resumen:

  • Un objeto AppWidgetProviderInfo, para incluir los metadatos del widget (layout, frecuencia de actualización, clase AppWidgetProvider…). Será definido en un XML.
  • Una implementación de la clase AppWidgetProvider, para incluir los métodos básicos que nos permitan, a través de eventos broadcast, gestionar el widget.
  • Un layout, definido en XML
  • Opcional: Una actividad de configuración para el widget, la cual será lanzada cuando añadamos el widget en algún sitio, para configurar el mismo widget con diferentes casos.

Para ello, tendremos que declarar nuestro widget en el Manifest (recordad, lo que no está en el Manifest, no existe para Android):

Podéis ver los ejemplos de Android, pero antes de ello mi recomendación pasa por leer todo lo referente al diseño de widgets, para no caer en errores que puedan hacer de nuestro widget un quebradero de cabeza al usuario.

Con esto estarían todos los conceptos, y sólo nos queda un artículo más con información adicional y conceptos menores a tener en cuenta.

Pero a pesar de que acabe esta sección en una semana, seguiremos contando cosas sobre programación.

Ver la sección Aprende Android en 20 conceptos