Android ждет завершения анимации - PullRequest
3 голосов
/ 11 марта 2012

Я перемещаю изображение и хочу воспроизвести звуковой файл после завершения анимации объекта
Изображение движется, но я пытался использовать нити, чтобы подождать, но это не сработало.

Animation animationFalling = AnimationUtils.loadAnimation(this, R.anim.falling);
iv.startAnimation(animationFalling);
MediaPlayer mp_file = MediaPlayer.create(this, R.raw.s1);
duration = animationFalling.getDuration();
mp_file.pause();
new Thread(new Runnable() {
    public void run() {
        try {
            Thread.sleep(duration);
            mp_file.start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  }).start();

Спасибо.

Ответы [ 2 ]

7 голосов
/ 11 марта 2012

Вы можете зарегистрировать делегата для анимации:

animationFalling.setAnimationListener(new AnimationListener() {

     @Override
     public void onAnimationStart(Animation animation) {    
     }

     @Override
     public void onAnimationRepeat(Animation animation) {
     }

     @Override
     public void onAnimationEnd(Animation animation) {
           // here you can play your sound
     }
);

Вы можете узнать больше о AnimationListener здесь

0 голосов
/ 11 марта 2012

Предложить вам

  • Создать объект для инкапсуляции времени жизни "анимации"
  • В объекте у вас будет поток ИЛИ таймер
  • Предоставитьметоды для запуска () анимации и awaitCompletion()
  • Использование частного конечного поля Object completionMonitor для отслеживания завершения, синхронизации по нему и использования wait() and notifyAll() для координации awaitCompletion ()

Фрагмент кода:

final class Animation {

    final Thread animator;

    public Animation()
    {
      animator = new Thread(new Runnable() {
        // logic to make animation happen
       });

    }

    public void startAnimation()
    {
      animator.start();
    }

    public void awaitCompletion() throws InterruptedException
    {
      animator.join();
    }
}

Вы также можете использовать ThreadPoolExecutor с одним потоком или ScheduledThreadPoolExecutor и захватывать каждый кадр анимации как вызываемый.Отправляя последовательность Callables и используя invokeAll() or a CompletionService, чтобы заблокировать интересующий вас поток, пока анимация не будет завершена.

...