PDA

Ver la Versión Completa : Cambiar fondo secuencialmente


violgore
31/08/14, 20:36:50
Hola compañeros
estoy realizando una app y necesito que cuando le doy a un boton, se abra una activity y muiestre un fondo, pero a los dos o tres segundo muestre otro, y asi.

Lo he intentado con el metodo OnStart y bueno lo que hace es que la muestra en blanco, he probado dos modos

@Override
Protected void onStart() { solo muestra en blanco

protected void onStart(Bundle savedInstanceState) { -- estre muestra el ultimo fondo definido, pero no los intermedios.

He de decir que he implementado un delay, para que se vaya viendo los cambios

Gracias de antemano

mocelet
31/08/14, 22:42:26
Si el delay lo estás haciendo con Thread.sleep estás bloqueando el hilo de ejecución y por eso solo se muestra el último fondo. Android no puede refrescar la pantalla mientras tienes el control del hilo principal.

Soluciones hay varias, bien usando el Handler y el método postDelayed para programar el cambio de fondo en el tiempo que sea o usar los temporizadores (clase Timer, aunque podría tener problemas al actualizar elementos de la interfaz gráfica), o incluso otro hilo (idem). A mí personalmente me gusta el handler.

Aquí tienes un ejemplo: http://www.mopri.de/2010/timertask-bad-do-it-the-android-way-use-a-handler/

violgore
01/09/14, 19:09:25
Muchas gracias, voy a probar

manolazo
01/09/14, 19:17:17
Buenas.

Yo lo he hecho para cambiar alguna view usando scheduleAtFixedRate de la siguiente manera
En onCreate pones esto:
(esta programado para poner 4 Imagenes diferentes)

int anima=0;
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run() {
handler.post(new Runnable(){
@Override
public void run() {
if(anima==0){
amimarInfo(Imagenes.previews[0]);
anima=1;
}

else if(anima==1){
amimarInfo(Imagenes.previews[1]);
anima=2;
}

else if (anima==2){
amimarInfo(Imagenes.previews[2]);
anima=3;
}
else if (anima==3){
amimarInfo(Imagenes.previews[3]);
anima=4;
}else if(anima==4){
amimarInfo(Imagenes.previews[4]);
anima=0;
}

}
});
}
}, 0, 6000);


EN donde amimarInfo es :


public void amimarfondo(int img ){

yourLayout.setBackgroundResource(img);
}


donde yourLayout es tu layout previamente definido con su ID y donde las imagenes las almacenas en un array o un arrayList o lo que quieras.

Usa tambien el handler como dice mocelet para no bloquear el hilo principal

Supongo que habra mil formas de hacerlo pero a mi se me ocurrio hacer esta aunque los cambios los hacia tambien con animaciones, pero funcionar funciona.

mocelet
01/09/14, 19:27:24
Si usas handler te sobra el timertask, con un postDelayed ya programas la siguiente ejecución cuando toque.

manolazo
01/09/14, 22:10:25
Con postDelayed ejecutas lo que tienes dentro pasado un tiempo en milisegundos y sobra el Timer pero el quiere que se ejecute de forma continua , por eso uso el scheduleAtFixedRate usando el timer, ¿o hay alguna forma de que se ejecute en forma de bucle con el postdelayed?
pero vamos que habrá mil formas de hacerlo digo yo.

Un saludo.

mocelet
01/09/14, 22:39:01
Claro, llamando al postDelayed justo al final del runnable para que se vuelva a ejecutar (es lo que hace en ejemplo que le puse enlace) . El runnable por cierto no hace falta crearlo cada vez, puedes guardar el objeto en una variable y reutilizarlo.

manolazo
02/09/14, 00:11:20
ah ok, no me fije bien en el link. La verdad que es un buen truco y no usas el scheduleAtFixedRate.
Un saludo.

violgore
02/09/14, 22:17:35
Gracias a todos por vuestra ayuda, sois geniales