Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Mostrando secuencias continuas de imágenes en ImageView

Tengo una vela y una llama como vistas separadas de la imagen. Cuando el usuario hace tapping en la llama, su recurso extraíble se establece en transparente, lo que significa que la llama ha soplado.

También quiero mostrar el humo como la llama es quemada. Para eso tengo unas 21 imágenes de humo negro que pueden ser mostradas en secuencia rápida para que los usuarios lo vean como humo. Aquí está mi código que cuelga cuando se llama la llama (R.drawable.smoke_22 es la imagen transparente para la llama y R.drawable.candle_1 es la imagen de la llama amarilla, la bandera es para rastrear si la llama es actualmente quemada o no flag = Flase significa que la llama sigue iluminándose):

int[] smokeImages = { R.drawable.smoke_1, R.drawable.smoke_2, R.drawable.smoke_3, R.drawable.smoke_4, R.drawable.smoke_5, R.drawable.smoke_6, R.drawable.smoke_7, R.drawable.smoke_8, R.drawable.smoke_9, R.drawable.smoke_10, R.drawable.smoke_11, R.drawable.smoke_12, R.drawable.smoke_13, R.drawable.smoke_14, R.drawable.smoke_15, R.drawable.smoke_16, R.drawable.smoke_17, R.drawable.smoke_18, R.drawable.smoke_19, R.drawable.smoke_20, R.drawable.smoke_21 }; this.flamImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (flag) { flamImageView.setImageDrawable(getResources().getDrawable( R.drawable.smoke_22)); flag = false; startTimer(); } else { flamImageView.setImageDrawable(getResources().getDrawable( R.drawable.candle_1)); flag = true; smokemageView.setImageResource(R.drawable.smoke_22); } } }); } private void startTimer() { for (int i = 0; i < 21; i++) { try { Thread.sleep(250); smokemageView.setImageResource(smokeImages[i]); } catch (InterruptedException localInterruptedException) { } } smokemageView.setImageResource(R.drawable.smoke_22); } 

La llama se apaga y vuelve en el tacto repetitivo, pero no veo humo adecuado de animación

3 Solutions collect form web for “Mostrando secuencias continuas de imágenes en ImageView”

Usted podría simplemente envolver su declaración en un bucle de tiempo, establecido por un booleano: sólo tiene que establecer el booleano a la verdad cada vez que desea que el dibujable para animar.

 private void startTimer() { while (timing) { for (int i = 0; i < 21; i++) { try { Thread.sleep(250); smokemageView.setImageResource(smokeImages[i]); } catch (InterruptedException localInterruptedException) { } } } smokemageView.setImageResource(R.drawable.smoke_22); } 

De lo contrario podría crear un objeto AnimationDrawable : (probablemente la ruta más fácil y más a prueba de errores)

 AnimationDrawable anim = new AnimationDrawable(); anim.addFrame( getResources().getDrawable(R.drawable.smoke_1), 250); anim.addFrame( getResources().getDrawable(R.drawable.smoke_2), 250); anim.addFrame( getResources().getDrawable(R.drawable.smoke_3), 250); anim.addFrame( getResources().getDrawable(R.drawable.smoke_4), 250); //......So on, so forth until you have a satisfying animation sequence //set ImageView to AnimatedDrawable smokemageView.setImageDrawable(anim); //if you want the animation to loop, set false anim.setOneShot(false); anim.start(); 

Espero que esto ayude, codificación feliz!

Mientras que algunas de las otras respuestas aquí probablemente resolverán su problema inmediato, esta no es la mejor manera de crear una animación.

La mejor manera es usar la clase AnimationDrawable y dejar que el framework haga todo el trabajo para usted:

http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

Thread.sleep es malo. Muy mal.

Sin embargo, le sugiero que utilice un temporizador o un controlador .

Pequeño ejemplo para TimerTask:

 Timer timer = new Timer(); timer.schedule(new ImageTask(), 0, 250); class ImageTask extends TimerTask { public void run() { // Change image here. } } 

La clase ImageTask se ejecutará cada 250ms. Usted puede cambiar su imagen allí.

Pequeño ejemplo para Handler:

 final Handler handler = new Handler(); final Runnable r = new Runnable() { public void run() { // Change image here. handler.postDelayed(this, 250); } }; handler.post(r); 

Va a resolver su problema, pero no es por mucho la mejor manera de hacerlo. GreyBeardedGeek tiene una buena solución alternativa para su problema.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.