9

我想创建一个递增的秒表,例如秒表。

所以我希望能够以 00:01 的格式显示秒数和分钟数...

谷歌只提供了 24 小时制的示例,我想知道有人可以让我从我想做的示例或教程开始吗?

编辑:

到目前为止,这是我在 Android 中使用的 Chronometer

在 onCreate()

    secondsT = 0;
    elapsedTimeBeforePause = 0;

    stopWatch.start();
    startTime = SystemClock.elapsedRealtime();
    stopWatch.setBase(elapsedTimeBeforePause);

     stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
            @Override
            public void onChronometerTick(Chronometer arg0) {
                //countUp is a long declared earlier
                secondsT = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
                String asText = (secondsT / 60) + ":" + (secondsT % 60); 
                //textGoesHere is a TextView
                ((TextView)findViewById(R.id.time)).setText(asText);
            }
     });

在 onDestroy()

@Override
public void onDestroy() {

    inCall = false;
    elapsedTimeBeforePause = SystemClock.elapsedRealtime() - stopWatch.getBase();

    super.onDestroy();
}

上面编译并运行,但 TextView 永远不会增加,它总是保持在 0,任何人都可以看到为什么吗?

4

2 回答 2

29

我假设您不了解 Android Chronometer- 它已经具有基本的秒表功能。您需要稍微处理一下它的特性,但是一旦您了解了它的工作原理,就不难让它做您想做的事情。

在手机上计算时间有几种方法,但主要有两种:

  1. “实时”,比如现在根据我的电脑时钟,在英国是上午 11 点 23 分。但是,如果我的计算机与时间服务器联系并被告知它的时间错误,或者如果我带着笔记本电脑旅行并跨越时区边界,这可能会改变。使用它会对您的秒表造成严重破坏,因为测量的时间可能随时改变。

  2. “自开机后经过的时间”,即手机开机后的毫秒数。这个数字与它的实际时间没有任何关系,但它会以完全可预测的方式表现。这就是 Android Chronometer 使用的。

Chronometer本质上是一个“向上计数”计时器,将电流SystemClock.elapsedRealtime()与设置为基础时间的 elapsedRealtime() 进行比较。两者之差除以 1000 就是计时器启动后的秒数。但是,如果您停止计时器然后重新启动它,您将得到一个违反直觉的结果 - 计时器将显示经过的时间,就好像它从未停止过一样。这是因为您需要调整其基本时间以考虑它的停止时间。这很简单:

// When you're stopping the stopwatch, use this
// This is the number of milliseconds the timer was running for
elapsedTimeBeforePause = SystemClock.elapsedRealtime() - timer.getBase();

// When you're starting it again:
timer.setBase(SystemClock.elapsedRealtime() - elapsedTimeBeforePause);

编辑:这是基本秒表的完整代码,它在 TextView 中显示您的时间,而不是在 XML 文件中声明的 Chronometer 小部件。

public class TestProject extends Activity {
    TextView textGoesHere;
    long startTime;
    long countUp;

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

        Chronometer stopWatch = (Chronometer) findViewById(R.id.chrono);
        startTime = SystemClock.elapsedRealtime();

        textGoesHere = (TextView) findViewById(R.id.textGoesHere);
        stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
            @Override
            public void onChronometerTick(Chronometer arg0) {
                countUp = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
                String asText = (countUp / 60) + ":" + (countUp % 60); 
                textGoesHere.setText(asText);
            }
        });
        stopWatch.start();
    }
}

在你的 main.xml 你需要有这个

<Chronometer android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/chrono"
    android:visibility="gone"/>

毫无疑问,有一种方法可以让 Chronometer 工作而不在 XML 文件中声明它,但是构造函数Chronometer stopwatch = new Chronometer(this);不能正常工作。

上面的代码以非常基本的方式显示了经过的时间。例如,如果只过了 5 秒,它将显示0:5而不是0:05您可能想要的。解决这个问题并不难,但我会把它留给你去解决!:)

于 2010-03-29T10:43:25.210 回答
2

这个数字时钟怎么样。

但基本上你应该能够通过谷歌搜索java、秒表、数字时钟等关键字来找到许多java实现......

您可以查看Stopwatch Applet并根据需要进行修改(哎呀,这个没有来源)

于 2010-03-29T09:32:32.700 回答