¿Cómo puedo cambiar la duración de una animación de Android AnimationDrawable sobre la marcha?

Soy nuevo en la plataforma ANDROID. Estoy usando lo siguiente para animar un conjunto de 16 "marcos" usando AminationDrawable en mi aplicación:

En el archivo XML tengo:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/image_1" android:duration="200" /> <item android:drawable="@drawable/image_1_25" android:duration="200" /> <item android:drawable="@drawable/image_1_5" android:duration="200" /> <item android:drawable="@drawable/image_1_75" android:duration="200" /> <item android:drawable="@drawable/image_2" android:duration="200" /> <item android:drawable="@drawable/image_2_25" android:duration="200" /> <item android:drawable="@drawable/image_2_5" android:duration="200" /> <item android:drawable="@drawable/image_2_75" android:duration="200" /> <item android:drawable="@drawable/image_3" android:duration="200" /> <item android:drawable="@drawable/image_3_25" android:duration="200" /> <item android:drawable="@drawable/image_3_5" android:duration="200" /> <item android:drawable="@drawable/image_3_75" android:duration="200" /> <item android:drawable="@drawable/image_4" android:duration="200" /> <item android:drawable="@drawable/image_4_25" android:duration="200" /> <item android:drawable="@drawable/image_4_5" android:duration="200" /> <item android:drawable="@drawable/image_4_75" android:duration="200" /> </animation-list> 

En el código Java tengo los siguientes

Primero estoy declarando la clase y añadiendo un método onCreate () donde configuro la animación.

 public class MyNewActivity extends Activity { // member variables (accessible from within class methods below). AnimationDrawable mainAnimation; long mSpeed = 50; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_widget); // set up image ImageView mainImage = (ImageView) findViewById(R.id.image_widget); mainImage.setBackgroundResource(R.drawable.animated_image); mainAnimation = (AnimationDrawable) mainImage.getBackground(); }; <...snip...> 

… entonces más adelante comienzo mi dibujo cuando el usuario presiona un botón que llamo el siguiente para comenzar la animación que se mueve:

 private void start() { // start the image rotating. if (mainAnimation.isRunning()) mainAnimation.stop(); int numFrames = mainAnimation.getNumberOfFrames(); for (int ii = 0; ii < numFrames; ii++ ) { // change the animation speed. Drawable d = mainAnimation.getFrame(ii); mainAnimation.scheduleDrawable(d, mainAnimation, mSpeed); } } 

<… snip …>

Así que en otras partes del código tengo un lugar para ajustar la variable miembro "mSpeed". Si hago esto y luego llamo a "start ()", la animación se iniciará, sin embargo, la velocidad es siempre la misma (esencialmente lo que se definió en el XML anterior.Mi pregunta es, ¿cómo puedo modificar la "duración" de los marcos Para mover esta animación más rápido / más lento basado en la entrada del usuario? No veo ninguna manera de modificar un estado de "duración", y estaba bajo la suposición de que la llamada "ScheduleDrawable ()" cambiaría la duración de los marcos del dibujo.

Gracias por la ayuda Mark.

Tuve el mismo problema, pero me las arreglé para resolverlo al leer el código fuente de AnimationDrawable mediante la implementación de mi propia clase AnimationDrawable que se extiende AnimationDrawable y anular el método Run() y añadir método setDuration() que me permite establecer la duración como sigue:

Al revisar el método de ejecución original vemos que hace lo mismo pero llamando scheduleSelf(this, SystemClock.uptimeMillis() + duration); Con la duración que usted especificó al agregar el marco así que lo cambié. También agrego la duración porque utilizo el mismo para todos mis marcos pero usted puede utilizar el arsenal de la nueva duración.

 import android.graphics.drawable.AnimationDrawable; import android.os.SystemClock; public class MyAnimationDrawable extends AnimationDrawable { private volatile int duration;//its volatile because another thread will update its value private int currentFrame; public MyAnimationDrawable() { currentFrame = 0; } @Override public void run() { int n = getNumberOfFrames(); currentFrame++; if (currentFrame >= n) { currentFrame = 0; } selectDrawable(currentFrame); scheduleSelf(this, SystemClock.uptimeMillis() + duration); } public void setDuration(int duration) { this.duration = duration; //we have to do the following or the next frame will be displayed after the old duration unscheduleSelf(this); selectDrawable(currentFrame); scheduleSelf(this, SystemClock.uptimeMillis()+duration); } } 

Es mi primera respuesta, así que espero que te ayude y se explica bien.

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