所以我有一个AnimationDrawable可以在屏幕上移动一个字符。动画工作正常,但我需要在刷新屏幕时停止其余的GUI。基本上当地图移动时,游戏必须刷新屏幕以更新新位置。重绘的代码在游戏类中,动画在gridview的图像适配器中,用于显示实际的游戏板。这是两行代码中的麻烦。
playerAdapter.animateLeft();
redraw();
第一行调用具有两个需要发生的动画的适配器,两者都需要700ms。然后,重绘会更新电路板本身。问题是,重绘不等动画。我已经尝试过使用睡眠和类似的东西,但这只是暂停整个该死的东西,没有任何反应。我想我需要使用线程或处理程序,但我不确定它是如何工作的。有任何想法吗?非常感谢所有帮助:)
答案 0 :(得分: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);
};
您还可以记录开始动画的时间,并将持续时间(您事先知道的)添加到其中以获得结束时间。但是,这可能是不准确的,因为设置和启动动画也需要一些时间。
答案 1 :(得分: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);