0

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

    playerAdapter.animateLeft();
    redraw();

第一行调用适配器,它有两个需要发生的动画,都需要 700 毫秒。然后,重绘更新板本身。问题是,重绘不等待动画。我试过使用 sleep 和类似的东西,但这只是暂停了整个该死的事情,没有任何反应。我想我需要使用线程或处理程序,但我不确定它是如何工作的。有任何想法吗?非常感谢所有帮助:)

4

2 回答 2

10

尝试:

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);
    };

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

于 2013-04-06T21:32:23.063 回答
1

另一个有趣的解决方案:

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);
于 2015-11-10T14:45:38.227 回答