Me gustaría esperar hasta que finalice una animación * en un Android ImageView antes de continuar la ejecución del programa, ¿cuál es la forma correcta de hacerlo?Android Animation: ¿esperar hasta que termine?
- (en este contexto "terminado" significa que se ejecuta a través de todos sus marcos exactamente una hora y se detiene en el último estoy claro si esta animación será un androide:.-Tiro = "true" animación porque me va a utilizar varias veces, pero no se llevará a cabo de forma continua, pero de forma intermitente)
Investigación/las suposiciones:
A. en el fondo de mi pregunta parece ser una pregunta hebra Java porque los implementos Android AnimationDrawableJava.lang.Runnable. Entonces, quizás los hilos son la solución. Tal vez la respuesta incluirá join?
B. El enfoque de otros parece haber sido utilizar AnimationListener, esto parece difícil e innecesariamente complejo para mis necesidades simples. Además, no estoy exactamente seguro de cómo hacerlo.
C. La clase AnimationDrawable tiene un método (booleano) isRunning que probablemente podría usarse en un ciclo while (es decir, while (anim.isRunning()) {wait (100ms)}). Pero tengo la corazonada de que este es el enfoque equivocado. Aunque algo similar parece ser mencionado en la concurrency tutorial
Fragmento de código
this.q_pic_view.setImageResource(0);
this.q_pic_view.setBackgroundResource(R.drawable.animation_test);
AnimationDrawable correct_animation = (AnimationDrawable) this.q_pic_view.getBackground();
correct_animation.start();
//here I tried to implement option C but it didn't work
while(correct_animation.isRunning()){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Animación
<?xml version="1.0" encoding="utf-8"?>
<animation-list android:id="@+id/AnimTest" android:oneshot="true" xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/animtest001" android:duration="33"/>
<item android:drawable="@drawable/animtest002" android:duration="100"/>
<item android:drawable="@drawable/animtest003" android:duration="66"/>
<item android:drawable="@drawable/animtest004" android:duration="66"/>
<item android:drawable="@drawable/animtest005" android:duration="33"/>
<item android:drawable="@drawable/animtest006" android:duration="66"/>
<item android:drawable="@drawable/animtest007" android:duration="33"/>
<item android:drawable="@drawable/animtest008" android:duration="66"/>
<item android:drawable="@drawable/animtest009" android:duration="100"/>
<item android:drawable="@drawable/animtest010" android:duration="100"/>
</animation-list>
una forma posible de conseguir el efecto deseado, aunque no es una respuesta a mi pregunta, es retrasar la ejecución de código adicional haciendo algo como esto:
int duration = 0;
//Add all of the frames together
for (int i=0; i<my_animation.getNumberOfFrames(); i++){
duration = duration + correct_animation.getDuration(i);
}
//delay the execution
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
public void run() {
DoYourNextStuff();
}
}, duration); //delay is here
Editar: Hay muchas maneras de resolver este problema, la respuesta dada probablemente resuelve el problema No lo probé, pero terminé esperando la cantidad correcta de tiempo (al principio), luego cambié a utilizando una tarea asíncrona (que tiene un método de control para completar) y ejecuté mi animación directamente en la llamada update progress de la tarea asincrónica. En la última iteración, estoy usando una vista de superficie enhebrada para ejecutar la animación. Esta última forma es, con mucho, la más rápida y la mejor (por razones distintas a las preguntadas en esta publicación). Espero que esto ayude a alguien.
¿cuánto tiempo lleva terminar la animación ...? –
CapDroid si suma todos los enteros en el fragmento de xml anterior obtendrá la duración total de la animación. Pero estoy buscando una solución general, así que eso no me ayudaría en este caso. – tjb
Simplemente prueba este Thread.sleep (663); 663 = Tiempo total de animación ... –