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 程度の変化しか記録しないので (変化の種類によって異なります)、通常はその速度を 2 倍 (25Hz または 30Hz) にしても安全です。

しかし、500Hzは過剰です。速度をもっと遅い値に設定してみて、何が起こるか見てみましょう。

TimerTask で cancel() を呼び出すこともできますがcancel()、の呼び出しは有効である必要があると思いTimerます。

于 2012-08-13T10:03:43.340 に答える