0

出力が歪んでいる単純な Android カウントダウン タイマーがあります。ユーザーがボタンを繰り返しクリックする必要がある単純なゲームを作成しようとしています。これにより、8 つの画像のコースで描画可能な画像が次々と変化します。ドローアブルは正常にレンダリングされますが、カウントダウン タイマー (30 秒から下にあるはずです) が、現在の経過時間を表していない不正確な数値を生成または保持しているようです。なぜこれが起こっているのか、またはこの問題を修正するために何を調査すべきかについて誰かアドバイスはありますか?

MultitapGame.java

    public class MultitapGame extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.multitapgame);

    final View btn = findViewById(R.id.gameButton);
    final View img = findViewById(R.id.game1);

    final TextView mTextField = (TextView) findViewById(R.id.gameCDT);
    final TextView mTextField2 = (TextView) findViewById(R.id.gameCDT2);
    final View mTextField3 = findViewById(R.id.gameCDT3);
    final View mTextField4 = findViewById(R.id.gameCDT4);


    img.setBackgroundResource(R.drawable.image1);

        btn.setOnClickListener(new OnClickListener() {

            public int count = 0;


        @Override
        public void onClick(View v) {

            setCount(getCount() + 1);
            new CountDownTimer(30000, 1000) {

                 public void onTick(long millisUntilFinished) {

                     int timeLeft =  (int) (millisUntilFinished / 1000) ;

                     ((TextView) mTextField).setText("seconds remaining: ");
                     final TextView mTextField2 = (TextView) findViewById(R.id.gameCDT2);
                        mTextField2.setText(String.valueOf(timeLeft + ""));

                 }

                 public void onFinish() {

                     int numTaps = count;
                     if(numTaps<150)
                     {
                         ((TextView) mTextField3).setText("Unlucky chucky! ");
                         ((TextView) mTextField4).setText("taps done: " + numTaps);
                     }
                     else
                     {
                         ((TextView) mTextField3).setText("Congrats Bro :-) !");
                         ((TextView) mTextField4).setText("taps done: " + numTaps);
                     }
                 }
              }.start();


            if(count==15)
            {
            img.setBackgroundResource(R.drawable.image2);}
            if(count==30)
            {
            img.setBackgroundResource(R.drawable.image3);}
            if(count==45)
            {
            img.setBackgroundResource(R.drawable.image4);}
            if(count==60)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==75)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==90)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==100)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==110)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==115)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==118)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==121)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==123)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==125)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==126)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==127)
            {
            img.setBackgroundResource(R.drawable.image6);}

            if(count==130)
            {
            img.setBackgroundResource(R.drawable.image7);}
            if(count==140)
            {
            img.setBackgroundResource(R.drawable.image1);}
            if(count==160)
            {
                Intent i = new Intent();
                i.setClassName("com.B00512756.angertwo",
                        "com.B00512756.angertwo.Strategies");
                startActivity(i);
                finish();}

        }


        public int getCount() {
            return count;
        }


        public void setCount(int count) {
            this.count = count;
        }
        });
}

}

4

1 に答える 1

1

問題は、 onClick メソッド内に CountDownTimer を実装することにあると思います。

次のように、CountDownTimer を拡張するサブクラスとして実装することをお勧めします。

public class MyCounter extends CountDownTimer{

        public MyCounter(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

                 @Override
                 public void onTick(long millisUntilFinished) {

                     mTextField.setText("seconds remaining: ");
                     mTextField2.setText(String.valueOf((int) (millisUntilFinished/1000) + ""));

                 }

                 @Override
                 public void onFinish() {

                     int numTaps = count;
                     if(numTaps<150)
                     {
                         mTextField3.setText("Unlucky chucky! ");
                         mTextField4.setText("taps done: " + numTaps);
                     }
                     else
                     {
                         mTextField3.setText("Congrats Bro :-) !");
                         mTextField4.setText("taps done: " + numTaps);
                     }
                 }

    }

onTick(long)また、 onTick() の呼び出しはこのオブジェクトに同期されるため、 onTick() 内のコードをできるだけ短くすることをお勧めします。したがってonTick(long)、前のコールバックが完了する前に への呼び出しが 1 回発生することはありません。onTick(long)これは、カウントダウン間隔と比較して、 の実装の実行にかなりの時間がかかる場合にのみ関連します。したがって、onTick()コードの実行に 1 秒以上かかると、カウントダウンに遅れが生じます。そんなわけで短くしました。

内部で TextView を初期化し、onCreate()それらを public クラス変数として宣言することをお勧めします。これにより、カウンターがティックまたは終了するたびにこれを行う必要がなくなります。

次のステップは、でタイマーを初期化することですonCreate:

final MyCounter timer = new MyCounter(30000,1000);

onClick()最後に、メソッドで開始する必要があります。

timer.start();
于 2012-07-09T04:32:53.617 に答える