2

我正在尝试实现一个小时分钟和秒格式的计时器。当我调用停止时,计时器仍会继续计时,并在我再次启动计时器时将其添加到其中。我也不希望计时器被重置,因此只能恢复它。

这是我的代码:

在创建时:

Chronometer myChronometer;
long time;
myChronometer =(Chronometer) findViewById(R.id.chronometer);
        myChronometer .setOnChronometerTickListener(this);
        myChronometer .setBase(SystemClock.elapsedRealtime()+time);

计时法:

 @Override
    public void onChronometerTick(Chronometer cArg) {
       time = SystemClock.elapsedRealtime() - cArg.getBase();

        int h   = (int)(time /3600000);
        int m = (int)(time - h*3600000)/60000;
        int s= (int)(time - h*3600000- m*60000)/1000 ;
        String hh = h < 10 ? "0"+h: h+"";
        String mm = m < 10 ? "0"+m: m+"";
        String ss = s < 10 ? "0"+s: s+"";
        cArg.setText(hh+":"+mm+":"+ss);
    }
4

1 回答 1

2

正如您在文档中所读到的

别再数了 这不会影响从 setBase(long) 设置的基数,只会影响视图显示。

因此,您必须重置天文台的底座。在你的开始按钮上做:

        ((Button) findViewById(R.id.start)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //THIS RESET YOUR CHRONOMETER BASE
                myChronometer.setBase(SystemClock.elapsedRealtime()); 
                myChronometer.start();
            }
        });

如果您想暂停并恢复您的计时器,您必须跟踪从暂停点击经过的时间,然后在开始时设置正确的基准:

long timeWhenStopped;

((Button) findViewById(R.id.start)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        myChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
        myChronometer.start();
    }
});

((Button) findViewById(R.id.stop)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        myChronometer.stop();
        timeWhenStopped = myChronometer.getBase() - SystemClock.elapsedRealtime();
    }
});
于 2017-02-02T16:04:44.833 回答