Android Animation: Подождите, пока закончится?

Я хотел бы дождаться завершения анимации * в Android ImageView, прежде чем продолжить выполнение программы. Как правильно это сделать?

  • (в данном контексте «завершено» означает, что он выполняет все свои кадры ровно один раз и останавливаются на последнем. Мне неясно, будет ли эта анимация андроид: oneshot = "true", потому что я буду использовать ее несколько раз, но она будет выполняться не постоянно, а с перерывами)

Исследования / предположения:

A. По сути, мой вопрос, похоже, связан с веткой Java, потому что Android AnimationDrawable реализует Java.lang.Runnable . Так что, возможно, решение - потоки. Возможно, ответ будет включать соединение ?

B. Похоже, что подход других заключался в использовании AnimationListener , это кажется трудным и излишне сложным для моих простых нужд. К тому же я не совсем уверен, как это сделать.

С. Класс 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 задачи async напрямую. На последней итерации я использую вид поверхности с резьбой для запуска анимации. Этот последний способ, безусловно, самый быстрый и лучший (по причинам, отличным от тех, о которых спрашивается в этом посте). Надеюсь, это кому-то поможет.

31
задан Community 23 May 2017 в 12:03
поделиться