studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java android for-loop thread-sleep

java - para - manual de programacion android pdf



Cambiar imágenes en un bucle-Android (3)

Me pregunto por qué aún no pude encontrar una manera de hacer esto. Aunque parece muy simple, pasé todo el día para esto. Pero no pudo hacer eso.

Tengo un conjunto de imágenes de dados. 1.png, 2.png, .... y 6.png. Hay un ImageView en mi diseño. Es decir,

ImageView dice = (ImageView) findViewById(R.id.imageViewrollingdiceOne);

Aquí quiero cambiar esta imagen Ver rápidamente para ver una especie de visual / animación usando más de 6 imágenes. Para eso escribí la siguiente pieza de código.

Código 1:

for (int j=0;j<10;j++){ int randomNum = random.nextInt(6); System.out.println("Random Value " + randomNum); dice.setImageResource(images[randomNum]); }

Salida:

No hay un visual. imageView permanece sin cambios y cambia repentinamente en la última iteración del ciclo. Pensé que era porque el ciclo se ejecuta muy rápido. Luego hice lo siguiente.

Código 2:

for (int j=0;j<10;j++){ int randomNum = random.nextInt(6); System.out.println("Random Value " + randomNum); dice.setImageResource(images[randomNum]); try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

Salida:

De nuevo, no hay un visual. imageView permanece sin cambios y cambia repentinamente en la última iteración del ciclo. Luego hice lo siguiente.

Código 3:

final Handler localHandler = new Handler(); Runnable runnableObject = new Runnable() { public void run() { final ImageView dice = (ImageView) findViewById(R.id.imageViewrollingdiceOne); int randomNum = random.nextInt(6); System.out.println("Random Value" + randomNum); dice.setImageResource(images[randomNum]); try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; for (int j=0;j<10;j++){ localHandler.postDelayed(runnableObject, 1000); }

De nuevo, no hay un visual. imageView permanece sin cambios y cambia repentinamente en la última iteración del ciclo. No hay ningún error en Logcat en los tres casos.

puede alguien ayudarme con esto? Enhebrar también no hace el truco. Cualquier solución probada sería apreciada.

Gracias a todos.


La razón por la que probablemente no veas los cambios es porque la devolución de llamada final al hilo de la interfaz de usuario principal ocurre después de que el hilo termina su ejecución y solo ves el resultado final. Ahora, este es mi entendimiento (probablemente pobre) y alguien más versado en él probablemente pueda corregirme.

Dicho esto , probablemente deberías utilizar un objeto de AnimationDrawable :

ImageView sImage = (ImageView)findViewById(R.id.imageViewrollingdiceOne); AnimationDrawable anim = new AnimationDrawable(); for (int j=0;j<6;j++) { anim.addFrame(new BitmapDrawable(images[j], 200); } sImage.setBackgroundDrawable(anim); anim.setOneShot(false); anim.start();

Esto supone que ya ha generado images[] con las imágenes en orden aleatorio. Si quiere cambiar eso, coloque el código que necesite en el for-loop.

Lo que hace es crear un objeto de animación muy parecido a cómo vería un gif trabajar con un intervalo de retardo establecido entre cambios (en este código son 200 ms). Puede elegir cambiar ese número si lo desea. La llamada setOneShot asegura que se setOneShot en lugar de finalizar la animación y detenerse en la última imagen.


Esto es útil cuando usa una lista de elementos y cambia uno por uno según el intervalo de tiempo. Inicialmente valoro debería ser 0, el tamaño de la lista depende.

final Handler handler = new Handler(); handler.postDelayed(new Runnable(){ public void run(){ if(i<4) { galleryImg.setImageResource(myImageList[i]); i++; } else { i=0; } handler.postDelayed(this, 10000); } }, 500);


En primer lugar, ya existe una animación en Android que puede ayudarte a lograr lo que eres después de que se llame FrameAnimation , aquí hay un ejemplo sobre cómo usarlo:

Ejemplo de FrameAnimation

Su primer, segundo y tercer código se ejecutan en el hilo principal, ¡nunca debe usar sleep en el hilo principal!

Si aún desea configurar el recurso de imagen manualmente, puede usar este código:

final Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { int randomNum = random.nextInt(6); dice.setImageResource(images[randomNum]); handler.postDelayed(this, 500); } }, 500);