Ya tenemos planteada la aplicación. De una forma muy básica: pantalla de inicio a modo de “splash” con animación incluída, menú en un ListView con las opciones correspondientes al juego que luego veremos con detalle, etc… También adelantábamos que los permisos iban a requerir la conexión a Internet. Esto es debido a que la aplicación va a conectar y consultar algunos datos de la web oficial. En este punto nos tenemos que plantear una forma de recuperar esos datos, un formato y un flujo de actividad de red, en definitiva. En este caso vamos a emplear JSON, por ser un formato compacto, manejable , soportado y más ligero que el pesado XML. Además, Android incluye una versión de estas librerías. De cualquier manera esto no lo veremos hasta dentro de dos o tres entregas.
Una vez elegido el formato de intercambio de datos, debemos pensar en los aspectos que pueden hacer inestable o inconsistente la aplicación. como puede ser comprobar que tenemos conexión a Internet al ejecutar la aplicación y avisar de una manera u otra al usuario con una notificación Toast. Caso de no hacerlo, lanzaría una excepción y forzaría el cierre, algo que no es lo suficientemente educado ;-)
Pero vamos con lo inmediato por hacer, completar la el .java de la pantalla de inicio y entender como se ejecutan las animaciones. La plataforma Android soporte cuatro formas de animaciones gráficas:
- Gif animados: típicos gráficos animados que contienen frames para desplegar la animación.
- Animacion “frame-by-frame”: El SDK de Android nos ofrece la posibilidad de emplear un mecanismo similar a las animaciones “frame-by-frame” donde el programador usa gráficos individuales y transiciones entre ellos. (ver la clase AnimationDrawable).
- Animación “Tweened”: Simple pero efectivo método para definir animaciones que se apliquen a cualquier view ó layout.
- OpenGL ES: A través de su API, Android ofrece la posibilidad de emplear librerías openGL para iluminar, crear 3d, efectos de luz, flares….
Pantalla de inicio.
Crea un directorio dentro de /res que sea anim. De tal forma que en /res/anim tengas los xml que definan el comportamiento de los elementos que quieras animar. En este caso vamos a rotar una imagen que tenemos en la pantalla de inicio y que hemos definido en su correspondiente layout inicio.xml. Vamos a crear un xml que sea custom_anim.xml y que contenga lo siguiente:
custom_anim.xml
<?xml version="1.0" encoding="utf-8" ?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000" />
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2000">
</alpha>
<scale
android:pivotX="50%"
android:pivotY="50%"
android:fromXScale=".1"
android:fromYScale=".1"
android:toXScale="1.0"
android:toYScale="1.0"
android:duration="2000" />
</set>
fade_in.xml
<?xml version="1.0" encoding="utf-8" ?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2500">
</alpha>
</set>
fade_in2.xml
<?xml version="1.0" encoding="utf-8" ?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2500"
android:startOffset="2500">
</alpha>
</set>
En la primera, custom_anim.xml, aplicamos una rotación, fundido alpha y escalado de la imagen. En los ficheros fade_in.xml y fade_in2.xml, simplemente un pequeño fundido de 2,5 segundos (android:duration=”2500″) con la diferencia de que en la segunda esperamos precisamente otros 2,5 segundos a que aparezca (android:startOffset=”2500″). Manejar las animaciones es bastante intuitivo y muy personal. A efectos de demostrar brevemente como se hace, pueden servir estas.
La parte de animación en nuestro “TusPerlasInicioActivity”
Editamos TusPerlasInicioActivity.java para crear el método comienzaAnimacion(). Declaramos las librerias que vamos a usar, son estas:
import android.os.Bundle; import android.content.Intent; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.LayoutAnimationController; import android.view.animation.Animation.AnimationListener; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView;
Tenemos sobreescrito nuestro onCreate, como en las demás clases, renderizando el layout correspondiente con setContentView(view):
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.inicio);
}
Y ahora vamos a ver como creamos nuestro primer efectillo.
/**
* Método para iniciar nuestra animación de la pantalla de inicio
*/
private void comienzaAnimacion() {
// Fundido del texto superior del
TextView texto_superior = (TextView) findViewById(R.id.TextViewTopTitle);
Animation efecto_fundido = AnimationUtils.loadAnimation(this, R.anim.fade_in);
texto_superior.startAnimation(efecto_fundido);
... [código]
}
Lo primero que hacemos es decirle a nuestro método que queremos animar, un TextView que llamamos texto_superior y cuyo id está definido como TextViewTopTitle, de nuestro inicio.xml. Después le decimos que cargue nuestro efecto, lo llamamos efecto_fundido. Las propiedades del efecto las aplicará del recurso R.anim.fade_in (¿Os suena este xml?). Y “Voilá”, ya tenemos un efecto básico de fundido.
Dentro del mismo método onCreate, creamos el resto de efectos y nos encargamos de decirle que después de mostrarlos, vaya a la pantalla del menú:
//Fundido del texto de abajo despues de un breve delay de 2,5s
TextView texto_abajo = (TextView) findViewById(R.id.TextViewBottomTitle);
Animation efectillo_dos = AnimationUtils.loadAnimation(this, R.anim.fade_in2);
texto_abajo.startAnimation(efectillo_dos);
Esta es la parte donde se crea el ‘listener’ de la animación.
// Vamos al menu cuando haya acabado el efecto del texto de abajo
efectillo_dos.setAnimationListener(new AnimationListener() {
public void onAnimationEnd(Animation animation) {
// La animación ha terminado, vamos a la pantalla de menú.
startActivity(new Intent(TusPerlasInicioActivity.this, TusPerlasMenuActivity.class));
TusPerlasInicioActivity.this.finish();
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationStart(Animation animation) {
}
});
Esta es forma de recorrer la tabla y aplicar los efectos al contenido de sus celdas (custom_anim.xml, recordad):
// Carga las animaciones para todas las vistas dentro del TableLayout
Animation girando = AnimationUtils.loadAnimation(this, R.anim.custom_anim);
LayoutAnimationController controller = new LayoutAnimationController(girando);
TableLayout table = (TableLayout) findViewById(R.id.TableLayout01);
for (int i = 0; i < table.getChildCount(); i++) {
TableRow row = (TableRow) table.getChildAt(i);
row.setLayoutAnimation(controller);
}
Y por último la sobrecarga de onPause y onResume para terminar de rematar esta clase. Es en onResume donde llamamos a comienzaAnimacion():
@Override
protected void onPause() {
super.onPause();
// Paramos la animación
TextView texto_superior = (TextView) findViewById(R.id.TextViewTopTitle);
texto_superior.clearAnimation();
TextView texto_abajo = (TextView) findViewById(R.id.TextViewBottomTitle);
texto_abajo.clearAnimation();
TableLayout table = (TableLayout) findViewById(R.id.TableLayout01);
for (int i = 0; i < table.getChildCount(); i++) {
TableRow row = (TableRow) table.getChildAt(i);
row.clearAnimation();
}
}
@Override
protected void onResume() {
super.onResume();
// Comienza el 'espectaculo' ;-)
comienzaAnimacion();
}
Representación de lo que tendremos en pantalla:

Si puedo voy a ir colgando el proyecto completo para que lo podáis ir probando vosotros. ¡ Hasta la próxima entrega !
La verdad que ando bastante liado y no lo pude subir todavía Son animaciones muy sencillas (rotar y zoom de graficos) para una ‘splash screen’ y en el post ya explica como hacerlo. Déjame una semana y o lo subo o te lo envío al email.
Hola, para un proyecto quiero investigar sobre las animaciones que se pueden hacer en Android. Subiste el código? o me lo podrías pasar? Mil gracias!