Я хотел бы подождать, пока анимация не закончится * в Android ImageView, прежде чем продолжить выполнение программы, как правильно это сделать?
- (в данном контексте «готово» означает, чтоон просматривает все свои кадры ровно один раз и останавливается на последнем. Мне неясно, будет ли эта анимация анимацией android: oneshot = "true", потому что я буду использовать ее несколько раз, но она не будет выполняться непрерывноно периодически)
Исследования / догадки:
A.В глубине души мой вопрос кажется вопросом нити Java, потому что Android AnimationDrawable реализует Java.lang.Runnable .Так что, возможно, решения - это темы.Возможно, ответ будет включать присоединиться ?
B.Другой подход, похоже, заключался в использовании AnimationListener , это кажется сложным и излишне сложным для моих простых потребностей.Плюс я не совсем уверен, как это сделать.
C.Класс AnimationDrawable имеет (логический) метод isRunning, который, вероятно, можно использовать в цикле while (то есть, в то время как while (anim.isRunning ()) {wait (100ms)}).Но у меня есть ощущение, что это неправильный подход.Хотя нечто подобное, похоже, упоминается в руководстве по параллелизму
Фрагмент кода
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();
}
}
Анимация
<?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>
Один из возможных способов достиженияжелаемый эффект, хотя и не ответ на мой вопрос, заключается в том, чтобы отложить выполнение следующего кода, выполнив что-то вроде этого:
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
Редактировать: Есть много способов решить эту проблему, ответ, который дан, вероятно, делаетрешить проблему Я не проверял , но в итоге я просто ожидал правильное количество времени (сначала), затем я переключился на использование асинхронной задачи (которая имеет метод-обработчик для завершения) изапустил мою анимацию в вызове updateProgress асинхронной задачи напрямую.В последней итерации я использую многопоточное представление поверхности для запуска анимации.Этот последний способ, безусловно, самый быстрый и лучший (по причинам, отличным от тех, о которых говорится в этом посте).Надеюсь, это кому-нибудь поможет.