我尝试使用Chronometer在我的Android应用中创建一个简历按钮。到目前为止,我有一个简历方法的代码片段:
private long pauseResume() {
long timeWhenStopped = chronometer.getBase() - SystemClock.elapsedRealtime();
return timeWhenStopped;
}
以下是简历按钮的代码:
public void onClick(View v) {
switch(v.getId()) {
...
case R.id.resume_button:
chronometer.setBase(SystemClock.elapsedRealtime() + pauseResume());
chronometer.start();
break;
}
}
问题:例如,当我在00:05暂停计时器然后在10秒钟后按下恢复按钮时,计时器将在00:15重新开始计时。
我希望它再次从00:05开始,而不是00:15,因为它是一个“恢复”功能。
我很高兴你能提供帮助。感谢。
答案 0 :(得分:8)
有点太晚了,但可能有助于其他人。我认为这是解决问题的方法。
开始/恢复计时器:
private void chronoStart()
{
// on first start
if ( mLastStopTime == 0 )
mChronometer.setBase( SystemClock.elapsedRealtime() );
// on resume after pause
else
{
long intervalOnPause = (SystemClock.elapsedRealtime() - mLastStopTime);
mChronometer.setBase( mChronometer.getBase() + intervalOnPause );
}
mChronometer.start();
}
暂停计时器:
private void chronoPause()
{
mChronometer.stop();
mLastStopTime = SystemClock.elapsedRealtime();
}
您需要记住最后一个计时器停止时间。
在恢复时,您可以计算上次停止时间与新开始时间之间的时间。当你有这个间隔时,你只需将时间间隔添加到你的天文台基准时间(你"移动"原始开始时间)。
希望这会有所帮助;)
答案 1 :(得分:0)
Chronometer用于实现一个简单的计时器。你可以在elapsedRealtime()
时基给它一个开始时间,并从中计算,或者如果你没有给它一个基准时间,它将使用您拨打start()
的时间。
long timeWhenStopped = 0;
当您停止计时器时更新变量的值:
timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime();
mChronometer.stop();
我们还将在启动之前使用此变量调整计时器:
mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
mChronometer.start();
最后,如果您有办法重置计时器,那么您应该记住还要重置timeWhenStopped变量。像这样:
mChronometer.setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
答案 2 :(得分:0)
希望这对您有帮助...
我们需要一个成员变量来保存计时器暂停的时间。假设这是“ timeWhenChronometerIsPaused”
var timeWhenChronometerIsPaused:Long = 0
要启动计时器,请将基本设置为elaspedRealTime
fun startChronometer(){
chronometer.base = SystemClock.elapsedRealtime()
chronometer.start()
}
当天文钟暂停时,请及时保存ChronometerIsPaused变量的时间
fun pauseChronometer(){
timeWhenChronometerIsPaused = SystemClock.elapsedRealtime() - chronometer.getBase()
chronometer.stop()
}
要恢复计时码表,请将基数设置为当前时间与当ChronometerIsPaused时的时间之差,并重置timeChronometerIsPaused时的时间为0
fun resumeChronometer(){
chronometer.base = SystemClock.elapsedRealtime() - timeWhenChronometerIsPaused
timeWhenChronometerIsPaused = 0
}
最后,如果需要计算经过的时间,请使用“ timeWhenChronometerIsPaused”(如果其值不为零),否则请使用(SystemClock.elapsedRealtime()-chronometer.base)
fun getElapsedTime(): String {
val elapsedMillis: Long = if (timeWhenChronometerIsPaused > 0)
timeWhenChronometerIsPaused
else
SystemClock.elapsedRealtime() - chronometer.base
val hours = (elapsedMillis / 3600000).toInt()
val minutes = (elapsedMillis - hours * 3600000).toInt() / 60000
val seconds = (elapsedMillis - hours * 3600000 - minutes * 60000).toInt() / 1000
val millis = (elapsedMillis - hours * 3600000 - minutes * 60000 - seconds * 1000).toInt()
return "$hours:$minutes:$seconds:$millis"
}
答案 3 :(得分:0)
这是一个 kotlin 版本:
private var chronometerPausedTime: Long = 0
// to start the chronometer with 00:00
private fun Chronometer.startFromZero() {
base = SystemClock.elapsedRealtime()
start()
}
private fun Chronometer.pause() {
chronometerPausedTime = SystemClock.elapsedRealtime() - this.base
stop()
}
private fun Chronometer.resume() {
base = SystemClock.elapsedRealtime() - chronometerPausedTime
chronometerPausedTime = 0
start()
}
使用:
binding.chronometer.startFromZero()
//pause
binding.chronometer.pause()
//resume
binding.chronometer.resume()