Android 在继续编写代码之前,如何等待AnimationDrawable结束?

Android 在继续编写代码之前,如何等待AnimationDrawable结束?,android,animation,Android,Animation,所以我有一个动画绘图,可以在屏幕上将角色移动一个空间。动画效果很好,但我需要暂停GUI的其余部分,以避免刷新屏幕。基本上,当地图移动时,游戏必须刷新屏幕以更新新位置。重画的代码在游戏类中,动画在显示实际游戏板的gridview的图像适配器中。下面是两行有问题的代码 playerAdapter.animateLeft(); redraw(); 第一行调用适配器,适配器有两个需要执行的动画,都需要700毫秒。然后,重新绘制更新板本身。问题是,重画不会等待动画。我试过使用睡眠之类的东

所以我有一个动画绘图,可以在屏幕上将角色移动一个空间。动画效果很好,但我需要暂停GUI的其余部分,以避免刷新屏幕。基本上,当地图移动时,游戏必须刷新屏幕以更新新位置。重画的代码在游戏类中,动画在显示实际游戏板的gridview的图像适配器中。下面是两行有问题的代码

    playerAdapter.animateLeft();
    redraw();
第一行调用适配器,适配器有两个需要执行的动画,都需要700毫秒。然后,重新绘制更新板本身。问题是,重画不会等待动画。我试过使用睡眠之类的东西,但那只是暂停了整个该死的事情,什么也没发生。我认为我需要使用线程或处理程序,但我不确定这是如何工作的。有什么想法吗?非常感谢所有帮助:

尝试:

YourAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) { }

    @Override
    public void onAnimationEnd(Animation animation) {
        //Ended
    }

    @Override
    public void onAnimationRepeat(Animation animation) { }
});
编辑:哎呀。没有读可画的部分。下面是一个递归函数,用于检查是否所有帧都已结束:

 private void checkIfAnimationDone(AnimationDrawable anim){
        final AnimationDrawable a = anim;
        int timeBetweenChecks = 300;
        Handler h = new Handler();
        h.postDelayed(new Runnable(){
            public void run(){
                if (a.getCurrent() != a.getFrame(a.getNumberOfFrames() - 1)){
                    checkIfAnimationDone(a);
                } else{
                    Toast.makeText(getApplicationContext(), "ANIMATION DONE!", Toast.LENGTH_SHORT).show();
                }
            }
        }, timeBetweenChecks);
    };

您还可以记录开始动画的时间,并将之前知道的持续时间添加到动画中,以获得结束时间。但是,这可能不准确,因为设置和启动动画也需要一些时间。

另一个有趣的解决方案:

animation.start();
long totalDuration = 0;
for(int i = 0; i< animation.getNumberOfFrames();i++){
     totalDuration += animation.getDuration(i);
}                      
Timer timer = new Timer();
TimerTask timerTask = new TimerTask(){
     @Override
         public void run() {
              animation.stop();
    }
 };
timer.schedule(timerTask, totalDuration);