我们在开发安卓应用时,经常会用到计时器功能,用来设定一些计时任务或记录某一状态的维持时间。在安卓的SDK中有专门的计时器控件(android.widget.Chronometer),我们只需在源码中添加这一控件,并添加一些控制按钮进行计时控制即可。
但是在运行后我们会发现,该计时器的控制函数start()和stop()只是单次实现计时和停止功能,就像以前的秒表给多人跑步机时一样,stop()虽然让控件显示的时间停止了,但后台的时间仍在继续跑,当再次start()时,控件显示的时间会一下跳变到后台记录的时间,这说明start()和stop()只是让时间表面上的停止,并不是真正的停止。
有时,我们需要计时器能够实现暂停和继续,也就是说当继续计时时,计时器显示的时间是继续按暂停前的时间来跑的。要想实现这样的功能,只需定义另外几个函数,对时间记录做相应的运算处理即可。
以下是实现代码:
MainActivity.java
package com.android.time;
import android.app.Activity;
import android.app.Application;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.os.SystemClock;
import android.widget.Chronometer;
public class MainActivity extends Activity implements OnClickListener {
private Chronometer time;// 计时器
private long recordingTime = 0;// 记录下来的总时间
private long mExitTime = 0;
public void onRecordStart() {
time.setBase(SystemClock.elapsedRealtime() - recordingTime);// 跳过已经记录了的时间,起到继续计时的作用
time.start();
}
public void onRecordPause() {
time.stop();
recordingTime = SystemClock.elapsedRealtime() - time.getBase();// 保存这次记录了的时间
}
public void onRecordStop()//计时器归零
{
recordingTime = 0;
time.setBase(SystemClock.elapsedRealtime());
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
time = (Chronometer) this.findViewById(R.id.chronometer);
//此处也可以定义一些按钮来控制计时器
}
}
main.xml
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Chronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:format="格式"
android:textColor="颜色"
android:textSize="字体大小" />
</RelativeLayout>
这样就可以实现计时器的暂停与继续了。