1

基本上,当用户赢得比赛时,我想将原始分数动画(计数)到新分数。

我正在尝试使用计时器来执行此操作,如下所示

    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 不工作或计时器运行速度太快而被取消?

更新 - -

感谢关于刷新率太快的建议。我最终放弃了计时器,而是使用了一个在延迟后调用自身的可运行对象。

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

1 回答 1

2

为什么要以 500Hz 运行此计时器?这只是显示一个滴答作响的分数,对吧?人眼无法看到快速移动的事物。实际上,它只记录 13Hz 之类的变化(取决于它是什么类型的变化),所以通常情况下,将该速率加倍(到 25Hz 或 30Hz)是安全的。

不过,500Hz 太高了。尝试将速率设置为较慢,然后看看会发生什么。

您也可以尝试在 TimerTask 上调用 cancel()cancel(),尽管我认为调用Timer应该是有效的。

于 2012-08-13T10:03:43.340 回答