Как я могу изменить продолжительность анимации для Android AnimationDrawable «на лету»?

Я новичок в платформе ANDROID. Я использую следующее, чтобы анимировать набор из 16 "кадров", используя AminationDrawable в моем приложении:

В XML-файле у меня есть:

<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> 

В коде Java я имею следующее

Сначала я объявляю класс и добавляю метод onCreate (), где я настроил анимацию.

 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...> 

… затем позже я начинаю рисовать, когда пользователь нажимает кнопку Я вызываю следующее, чтобы начать перемещение анимации:

 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); } } 

<… чик …>

Поэтому в другом месте кода у меня есть место для настройки переменной-члена «mSpeed». Если я это сделаю, а затем вызову «start ()», анимация начнется, однако скорость всегда будет одинаковой (по существу, что было определено в XML выше). Мой вопрос в том, как я могу изменить «продолжительность» кадров Чтобы переместить эту анимацию быстрее / медленнее на основе пользовательского ввода? Я не вижу способа изменить состояние «продолжительности», и в предположении, что вызов «ScheduleDrawable ()» выше изменит продолжительность кадров чертежа.

Спасибо за помощь Марка.

Solutions Collecting From Web of "Как я могу изменить продолжительность анимации для Android AnimationDrawable «на лету»?"

У меня была такая же проблема, но мне удалось ее решить, прочитав исходный код AnimationDrawable, выполнив мой собственный класс AnimationDrawable, который расширяет AnimationDrawable и переопределяет метод Run() и добавляет метод setDuration() который позволяет мне установить продолжительность следующим образом:

Пересматривая исходный метод запуска, мы видим, что он делает то же самое, но вызывая scheduleSelf(this, SystemClock.uptimeMillis() + duration); С продолжительностью, указанной вами при добавлении фрейма, чтобы я изменил его. Я также добавляю продолжительность, потому что я использую то же самое для всех своих фреймов, но вы можете использовать массив новой продолжительности.

 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); } } 

Это мой первый ответ, поэтому я надеюсь, что это поможет вам, и это объясняется хорошо.