6.4.2.-
Programación en Android – Creando nuestra Splash (III)
En
este capítulo continuaremos modificando el layout de nuestra
pantalla de Splash añadiéndole algunas animaciones para
hacerlo más vistoso.
De
momento nuestra pantalla de splash tiene la siguiente apariencia:
Añadiendo
recursos de animación.
En principio vamos a crear estos
ficheros para las animaciones: fade_in1.xml, fade_in2.xml,
fade_out.xml, animacion_simbolos.xml.
Fichero
|
Tipo
de animación
|
fade_in1.xml
|
Animación
de aparición, de transparente al color que tenga el objeto.
Trabajaremos sobre el canal alpha.
|
fade_in2.xml
|
Igual
que fade_in1.xml pero en este caso el tiempo de comienzo será
distinto.
|
fade_out.xml
|
Desvanecimiento.
Fundido a negro.
|
animacion_simbolos.xml
|
Animación
que aplicaremos a los símbolos gráficos. Una
rotación y un zoom.
|
Para
hacer el fichero fade_in1.xml, debemos crear la carpeta anim
dentro del directorio res, en caso de no tenerla. Una
vez la hallamos creado, si con ella seleccionada pulsamos el botón
derecho del ratón y seleccionamos Nuevo->Android XML
file, nos aparecerá un diálogo en el que nos
pide unos datos, que por defecto (al haber seleccionado el directorio
anim) ya nos pone en el tipo de recurso “Tweened
animation” (Animación interpolada). En caso de no
ser así pues lo elegimos nosotros, ponemos el nombre de
nuestro fichero (fade_in.xml) y pulsamos en finalizar.
Abrimos
el fichero que hemos creado, y lo editamos para que quede de la
siguiente manera:
<?xml
version="1.0"
encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2000">
</alpha>
|
Lo
que hemos creado aquí será una animación
interpolada (tween) que modificará el canal alpha
(transparencia) del elemento al que lo apliquemos. Dicho cambio lo
hará desde la transparencia total (android:fromAmpha=”0.0”)
hasta hacerlo totalmente opaco (android:toAlpha=”1.0”)
y este proceso se prolongará durante 2000 milisegundos (2
segundos) (android:duration=”2000”).
Guardamos el fichero y creamos otro
con el nombre “fade_in2.xml”, en el que escribiremos lo
siguiente:
<?xml
version="1.0"
encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:startOffset="2000"
android:duration="2000">
</alpha>
|
Lo
único en lo que difiere este fichero con respecto al anterior
es en dónde pone android:startOffset=”2000”,
y este parámetro lo que hace es indicarle al sistema que
comience a aplicar el efecto cuando hayan transcurrido 2000
milisegundos (2 segundos).
Creamos
ahora un fichero con el nombre “fade_out.xml”, y le
ponemos el siguiente código:
<?xml
version="1.0"
encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:startOffset="4000"
android:duration="1000">
</alpha>
|
Creo
que no es necesario indicar nada de lo que hay en este fichero.
Ahora
creamos un fichero un poco más complejo al que llamaremos
“animacion_simbolos.xml”, al editarlo pondremos lo
siguiente:
<?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"/>
<scale
android:interpolator="@android:anim/overshoot_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:toXScale="1.0"
android:toYScale="1.0"
android:duration="2000"/>
</set>
|
En
este fichero vemos que usamos la etiqueta “set” para
crear un conjunto de animaciones a aplicar, tenemos una rotación,
un cambio en la transparencia, un cambio en la escala y hasta le
aplicamos un interpolador (overshoot_interpolator).
Guardamos
todo y vamos a aplicar estos efectos a los elementos de nuestro
layout.
En
el fichero ActividadSplash.java, añadimos un método
al que podemos llamar “animacionSplash()”, que
será el encargado de aplicar las diversas animaciones a los
elementos. En este método escribimos lo siguiente:
//Animación
para el TITULO1
TextView
titulo1 = (TextView)
findViewById(R.id.textView_Titulo1);
Animation
fadein1 = AnimationUtils.loadAnimation(this,
R.anim.fade_in1);
titulo1.startAnimation(fadein1);
|
En
estas líneas derivamos una clase de Animation (fadein1)
y le asignamos la animación que teníamos en el fichero
XML “fade_in1”.
La
animación comienza cuando llamamos al método
startAnimation con el parámetro de Animation
(fadein1).
Hacemos
lo mismo para el otro control textview, el del Título2.
Ahora
vamos a hacer algo diferente con las animaciones de la tabla. Las
animaciones también se pueden aplicar a todos los controles
hijos, como por ejemplo con los elementos de una tabla, para ello
utilizamos un objeto de tipo LayoutAnimationController.
Para realizarlo de esta manera, debemos cargar la animación,
crear una instancia de LayoutAnimationController,
configurarla y pasársela al método setLayoutAnimation,
por ejemplo:
//Animación
para los Bitmaps.
Animation
animacionSimbolos = AnimationUtils.loadAnimation(this,
R.anim.animacion_simbolos);
LayoutAnimationController
controlador = new
LayoutAnimationController(animacionSimbolos);
TableLayout
tabla = (TableLayout)
findViewById
(R.id.tableLayout_Tabla1);
tabla.setLayoutAnimation(controlador);
|
En
este caso, no es necesario llamar al método startAnimation(),
porque ya lo hace el LayoutAnimationController.
Este método aplica la
animación a cada vista hija, pero con un desfase en el tiempo
del 50% de la duración total (por defecto). También se
le puede poner algún atributo, como cambiar el orden en que
aplica el efecto así como para que aplique el efecto de forma
aleatoria.
Ahora
que hemos creado las animaciones, añadimos una llamada a esté
método ( animacionSplash() ) dentro del método onCreate
de ActividadSplash(). Ya
podemos hacer una pequeña ejecución del programa para
ver que es lo que ocurre.
Borrar las animaciones cuando
vamos a onPause()
Cuando
la aplicación se pone en pausa, sería recomendable
parar las animaciones, para ello se llama al método
clearAnimation().
Vamos
a implementar el método onPause
(botón derecho sobre el fichero java, Codigo
Fuente->Alterar o implementar métodos->onPause),
y en este método insertamos lo siguiente:
//Paramos
todas las animaciones:
TextView
titulo1 = (TextView)
findViewById(R.id.textView_Titulo1);
titulo1.clearAnimation();
TextView
titulo2 = (TextView)
findViewById(R.id.textView_Titulo2);
titulo2.clearAnimation();
TableLayout
tabla = (TableLayout)
findViewById(R.id.tableLayout_Tabla1);
tabla.clearAnimation();
|
También
podríamos tener en cuenta el volver a ponerlas en marcha en el
método onResume()
o en onRestart(), pero
de momento con esto nos es suficiente.
Pasar a la siguiente actividad
Ahora
que la animación ya está creada, al terminar esta
podemos pasar a la siguiente actividad (actividadMenu), para ello
podemos crear un intent
que se ejecute cuando termine la animación de mayor duración
(fade_in2).
Para
ello creamos un objeto AnimationListener,
que será encargado de ver en que estado está la
animación. Este objeto tiene callbacks
para controlar los eventos y saber cuándo comienza, termina o
vuelve a comentar (ciclo) la animación. En nuestro caso sólo
debemos controlar cuando termina el evento ( onAnimationEnd() )
Vamos
a ver como creamos el Listener:
fadein2.setAnimationListener(new
AnimationListener()
{
public
void
onAnimationEnd(Animation
animation)
{
//Llama
a la actividad destino
Intent
iExp = new
Intent(ActividadSplash.this,
ActividadMenu.class);
startActivity(iExp);
//Finaliza
esta actividad para no dejarla
//
en el buffer de vuelta atras.
ActividadSplash.this.finish();
}
@Override
public
void
onAnimationRepeat(Animation
animation)
{
//
TODO
Auto-generated method stub
}
@Override
public
void
onAnimationStart(Animation
animation)
{
//
TODO
Auto-generated method stub
}
});
|
El listener se lo
hemos asignado a fadein2, ya que es la animación
que más tiempo tarda en ejecutarse (la última en
finalizar).
Ejercicio: En el código
creamos también un fichero XML para un desvanecimiento
(fade_out)... intenta aplicarlo cuando finalize esta aplicación.
Si ejecutamos nuestra aplicación,
veremos como realiza las animaciones y después pasa a la
ActividadMenu, y que en caso de pulsar la tecla de
atrás que no vuelve a mostrar la ActividadSplash.
Más adelante modificaremos
esta función para hacer que llame a nuestra actividad de
salida (ActividadSalida) en caso de pulsar la tecla
atrás.
Ver.
1.0 – Revisión 10/02/2012
No hay comentarios:
Publicar un comentario