Android等待动画完成

时间:2012-03-10 20:11:41

标签: java android android-animation

我正在移动图像,我想在对象的动画完成后播放声音文件 图像移动但我尝试使用线程等待一段时间但它不起作用。

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 个答案:

答案 0 :(得分:7)

您可以注册动画的代表:

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 here

的更多信息

答案 1 :(得分:-1)

建议你

  • 创建一个对象以封装“动画”生命周期
  • 在对象中,您将拥有一个线程或一个计时器
  • 提供启动()动画的方法和awaitCompletion()
  • 使用私有最终对象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一起使用,并将动画的每个帧捕获为Callable。提交Callables序列并使用invokeAll() or a CompletionService来阻止您感兴趣的线程,直到动画完成。