基本上,当用户赢得游戏时,我想要从原始分数到新分数进行动画(计数)。
我尝试使用计时器执行此操作,如下所示
public final void updatePlayerScore(final int newScore){
final Timer t = new Timer();
TimerTask tt = new TimerTask() {
@Override
public void run() {
mHandler.post(new Runnable() {
public void run() {
initialScore++;
// update TextView
scoresTextView.setText("" + initialScore);
if(initialScore >= newScore){
t.cancel();
mHandler2.postDelayed(mLaunchNextQuestion,1000);
}
}
});
}
};
t.scheduleAtFixedRate(tt, 0, 2);
当initialScore等于或大于newScore时,每次调用TimerTask时,初始分数都会向上递增(它每2毫秒) - 它应取消定时器,然后加载新的活动mLaunchNextQuestion。
现实中发生的事情是,mLaunchNextQuestion不止一次被调用。我猜这是因为timer.cancel无法正常工作或者计时器正在快速取消?
UPDATE ---
感谢有关刷新率过快的建议。我最终放弃了计时器,而是使用了一个在延迟后调用自己的runnable。
private Runnable updatePlayerScoreNew(final int newScore){
Runnable aRunnable = new Runnable(){
public void run(){
if (initialScore >= newScore) {
mHandler.postDelayed(mLaunchNextQuestion,1000);
} else {
initialScore+=40;
if(initialScore > newScore){
scoresTextView.setText("" + newScore);
}else{
scoresTextView.setText("" + initialScore);
}
mHandler.postDelayed(updatePlayerScoreNew(newScore), 40);
}
}
};
return aRunnable;
}
答案 0 :(得分:2)
为什么你在500Hz下运行这个定时器?这只是显示一个滴答分数,对吧?人眼无法看到快速移动的东西。实际上,它只记录13Hz的变化(取决于它的变化类型),所以通常,将速率加倍(25Hz或30Hz)是安全的。
但是,500Hz是过度的。尝试将速率设置为较慢的速度,然后看看会发生什么。 You can also try calling cancel() on the TimerTask,虽然我认为在cancel()
上调用Timer
应该有效。