以 00:00 格式创建以秒为单位的递增计时器?
题
我想创建一个像秒表一样递增的第二计时器。
所以我希望能够以 00:01 的格式显示递增的秒数和分钟数...
Google 只提供了 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,有人能明白为什么吗?
解决方案
我假设你不知道 Android Chronometer
- 它已经具有基本的秒表功能。您需要稍微了解一下它的特性,但是一旦您了解了它的工作原理,让它做您想做的事情并不难。
在手机上计算时间的方法有多种,但主要有两种:
“实时”,比如现在根据我的电脑时钟,英国是上午 11:23。但是,如果我的计算机联系时间服务器并被告知它的时间错误,或者如果我携带笔记本电脑旅行并跨越时区边界,则情况可能会发生变化。使用此功能会对您的秒表造成严重破坏,因为测量的时间可能随时发生变化。
“自启动以来经过的时间”,即手机开机后的毫秒数。这个数字与实际时间没有任何关系,但它会以完全可预测的方式表现。这就是 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
你可能想要。解决这个问题并不难,但我会把它留给你来解决!:)