2

カウンターを 30 秒以上上げていると、あちこちで 1 秒スキップすることがよくあります。ディスプレイが表示された状態で、カウントダウンしています。ただし、乱数をスキップすることを選択します。スキップする数字は毎回同じ数字です。タイマーの長さを変更すると (ユーザーが変更します)、スキップされる番号が変更されます。コードを投稿しました。

免責事項: これは私の最初の (便利な) アプリなので、本当にうまくいかないか、うまく構成されていない可能性があります。大丈夫です、教えてください。私は批判を受け入れることができます。しかし、見てみてください。特定の秒数が失われる理由を誰かが知っている場合は、パイプしてください. ありがとう!

package com.ApphHose.runnersTimer;

//import a bunch of stuff

public class MainActivity extends Activity {
TextView text, lapNumber;
Button start;
boolean workrest, vibe;
int letsRun, lapCounter;
long length;
CountDownTimer timer;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    text = (TextView) findViewById(R.id.tv);
    lapNumber = (TextView) findViewById(R.id.tvLap);
    start = (Button) findViewById(R.id.bStart);
    letsRun = 2;
    lapCounter = 1;
    workrest = true;
    vibe = true;

    start.getBackground().setColorFilter(0xFF00FF00, PorterDuff.Mode.MULTIPLY);

    start.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            start.setText("Stop");
            start.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
            lapNumber.setText("Lap Number: 1");
            lapCounter = 0;
            run();
        }

    });

}

private void run() {

    SharedPreferences getSetup = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());
    String setRun = getSetup.getString("run", "1");
    long setRunset = Long.parseLong(setRun);
    setRunset = setRunset * 1000;

    String setWalk = getSetup.getString("walk", "1");
    long setWalkset = Long.parseLong(setWalk);
    setWalkset = setWalkset * 1000;

    if (letsRun >= lapCounter) {

        if (workrest == true) {
            workrest = false;
            length = setRunset;

        } else {
            workrest = true;
            length = setWalkset;
        }

        final CountDownTimer timer = new CountDownTimer(length, 1000) {

            @Override
            public void onFinish() {

                if (workrest){
                    if (vibe){
                        Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                        v.vibrate(2000);
                        run();
                    } else {
                        run();
                    }

                }else{
                lapCounter ++;
                lapNumber.setText("Lap Number: " + lapCounter);
                run();
                }
            }

            @Override
            public void onTick(long millisUntilFinished) {
                long min, sec;
                // TODO Auto-generated method stub
                min = millisUntilFinished / (60 * 1000);
                sec = (millisUntilFinished / 1000) % 60;
                String tmr = String.format("%d:%02d", min, sec);
                text.setText("" + tmr);

            }

        };
        timer.start();
        start.setOnClickListener(new View.OnClickListener() {
            //this is my button. start and stop. 
            public void onClick(View v) {
                if (start.getText() == "Stop") {
                    start.setText("Start");
                    lapCounter = 1;
                    start.getBackground().setColorFilter(0xFF00FF00, PorterDuff.Mode.MULTIPLY);
                    timer.cancel();
                    lapNumber.setText("Lap Number: 1");
                    text.setText("Stopped");
                } else {
                    start.setText("Stop");
                    start.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
                    run();
                }
            }
        });

    } else {
        text.setText("Done!");
        lapCounter = 1;

    }

}

// pop up menu
@Override
public boolean onCreateOptionsMenu(android.view.Menu menu) {
    // TODO Auto-generated method stub
    super.onCreateOptionsMenu(menu);
    MenuInflater blowUp = getMenuInflater();
    blowUp.inflate(R.menu.setup, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    switch (item.getItemId()) {
    case R.id.setup:
        Intent i = new Intent("com.ApphHose.runnersTimer.SETUP");
        startActivity(i);
        break;
    case R.id.out:
        finish();
        break;
    }
    return false;
}
}
4

1 に答える 1

6

sec = (millisUntilFinished / 1000) % 60;

整数を整数で割ると、整数が生成され、丸め誤差が発生する可能性があります。

sec = (millisUntilFinished / (double) 1000) % 60;

于 2012-09-20T01:56:09.713 に答える