Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/09/2012, 11:05
nephewless
 
Fecha de Ingreso: septiembre-2012
Mensajes: 5
Antigüedad: 12 años, 1 mes
Puntos: 0
Modificar ImageView desde un thread

Buenas!

A ver, os cuento, a ver si me podéis echar un cable, que ya llevo dos días con este problemilla y no consigo solucionarlo.

El caso es que para una práctica de la uni tengo que desarollar un juego de la oca para android. Esta todo hecho, pero me queda un problema por resolver.

Utilitzo una clase que extiende de AnimationDrawable para simular el lanzamiento de los dados y controlo cuando la simulación se termina.

Código:
 * *public abstract class CustomAnimationDrawableNew extends AnimationDrawable {

 * *	/** Handles the animation callback. */
 * *	Handler mAnimationHandler;

 * *	public CustomAnimationDrawableNew(AnimationDrawable aniDrawable) {
 * *	 * */* Add each frame to our animation drawable */
 * *	 * *for (int i = 0; i < aniDrawable.getNumberOfFrames(); i++) {
 * *	 * * * *this.addFrame(aniDrawable.getFrame(i), aniDrawable.getDuration(i));
 * *	 * *}
 * *	}

 * *	@Override
 * *	public void start() {
 * *	 * *super.start();
 * *	 * */*
 * *	 * * * Call super.start() to call the base class start animation method.
 * *	 * * * Then add a handler to call onAnimationFinish() when the total
 * *	 * * * duration for the animation has passed
 * *	 * * */
 * *	 * *mAnimationHandler = new Handler();
 * *	 * *mAnimationHandler.postDelayed(new Runnable() {

 * *	 * * * *public void run() {
 * *	 * * * * * *onAnimationFinish();
 * *	 * * * *}
 * *	 * *}, getTotalDuration());

 * *	}

 * *	/**
 * *	 * Gets the total duration of all frames.
 * *	 * 
 * *	 * @return The total duration.
 * *	 */
 * *	public int getTotalDuration() {

 * *	 * *int iDuration = 0;

 * *	 * *for (int i = 0; i < this.getNumberOfFrames(); i++) {
 * *	 * * * *iDuration += this.getDuration(i);
 * *	 * *}

 * *	 * *return iDuration;
 * *	}

 * *	/**
 * *	 * Called when the animation finishes.
 * *	 */
 * *	abstract void onAnimationFinish();
 * *}
Bien, en el hilo principal, hago la llamada a esta clase:

Código:
CustomAnimationDrawableNew cad = new CustomAnimationDrawableNew((AnimationDrawable) getResources().getDrawable(R.drawable.frame_animation)){
	 . . .
	void onAnimationFinish(){
...
	}
}
iv.setBackgroundDrawable(cad); //inserta la animacio
cad.start(); // inicialitza la animacio
y dentro del onAnimationFinish() hago un random del dado, printo en el mismo view donde se aplica la animación la imagen del dado resultante (es decir, si he sacado un uno, la imagen de un dado en la cara del uno xD ), luego calculo los movimientos, los pinto, y lanza el siguiente jugador que lo hace mediante la pulsación de un botón, o bien, el siguiente jugador puede ser automático, y lanza directamente.

El problema es que si se da el último caso, que el jugador es automático, al terminar la animación, empieza la animación del siguiente jugador directamente, sin poder ver que numero ha salido, y la ficha también se mueve a la vez que empieza la animación, y queda fatal.

Me gustaría poder mostrar la animación, inmediatamente cambiar la imagen y poner la del dado correspondiente, hacer una espera (medio segundo por ejemplo), mover la ficha, hacer otra espera (1 segundo) y que lanzara el siguiente jugador. El problema es que si pongo un wait se me queda todo parado, sin haberse cargado la imagen, ni haberse movido la ficha.... y estoy con el mismo problema, ya que al reactivarse estamos con las mismas.

Creo que la solución sería hacer el movimiento de fichas y el cambio de imagen del dado en threads, para así solo parar el thread principal, pero no me deja cambiar las imagenes ya que solo puedo cambiar imagenes del thread donde se han creado... y ahí estoy pillado... :(

Algun consejo o ayudilla?

Lo siento por el tocho... No he sabido resumir más o expliarme mejor...

Si necesitais más información, no dudeis en preguntar!

Muchas gracias de antemano!

Un saludete!