Android提供了一个计时器组件,叫做Chronometer,该组件继承自TextView,因此都会显示一段文字。但是它显示的并不是当前时间,而是从setBase()设置的时刻所经过的时间。
他的用法也十分简单,只提供了一个android:format属性,用于指定时间的格式。除此之外,还提供了一下一些方法以供使用:
setBase(): 用于设置计时器的起始时间。
setFormat(): 用于设置显示时间的格式。
start(): 开始计时。
stop(): 停止计时。
setOnChronometerTickListener(Chronometer.OnChronometerTickLisenter listener): 用于设置计时器的监听器,当计时器时间改变时触发该监听。
下面是他的使用方法:
在XML文件中添加一个定时器Chronometer:
<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/chronometer1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="29dp"
android:textSize="50sp"
android:textColor="#ff0000"/>
<Button
android:id="@+id/main_btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="开始" />
<Button
android:id="@+id/main_btn_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/main_btn_start"
android:layout_toRightOf="@+id/analogClock1"
android:text="重新" />
<Button
android:id="@+id/main_btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/main_btn_reset"
android:layout_marginTop="19dp"
android:text="停止" />
</RelativeLayout>
这里还添加了三个按钮,分别是为了开始计时,停止计时以及重新计时。
接着在java代码中对计时器进行操作:
public class MainActivity extends Activity {
@ViewInject(R.id.main_btn_start)
private Button btn_start;
@ViewInject(R.id.main_btn_stop)
private Button btn_stop;
@ViewInject(R.id.main_btn_reset)
private Button btn_reset;
@ViewInject(R.id.chronometer1)
private Chronometer chro;
private long recordtime = 0;//记录计时的时间
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewUtils.inject(this);
initListenter();
}
private void initListenter() {
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//开始计时的时间
chro.setBase(SystemClock.elapsedRealtime()-recordtime);
chro.start();//开始计时
}
});
btn_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
chro.stop();//停止计时
recordtime = SystemClock.elapsedRealtime()-chro.getBase();
}
});
btn_reset.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
chro.setBase(SystemClock.elapsedRealtime());
recordtime = 0;
chro.stop();
}
});
}
}
这里简单的用到了xUtils框架,在Activity中注入框架ViewUtils.inject(this); 并用注解@ViewInject(ID)将findViewById()省去。
实例化Chronometer和三个Button后,为三个Button添加监听器OnClickListerner并在重写的OnClick方法中处理相关的事件。
为开始按钮添加开始计时的监听:
private void initListenter() {
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
chro.setBase(SystemClock.elapsedRealtime()-recordtime);//开始计时的时间
chro.start();//开始计时
}
});
使用setBase()方法为计时器设置开始时间,SystemClock.elapseRealtime()方法返回的是一个long类型的数据,表示手机从开机到当前一共经过了多少毫秒,为了在点击停止计时按钮之后能从停止的时间开始计时,在后面减去了一个recordtime,recordtime记录的是停止计时的时候所显示的时间。
接着为停止按钮添加监听:
btn_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
chro.stop();//停止计时
recordtime = SystemClock.elapsedRealtime()-chro.getBase();
}
});
当点击停止按钮时执行stop()方法,计时器停止计时,显示的时间为停止计时之前的时间。之后记录计时器计时的时间,再用手机当前的时间减去计时器开始计时的时间:SystemClock.elasedRealtime()-chro.getBase()得到一个记录了计时的时间的long类型的数据。
最后在为重新计时按钮添加监听:
btn_reset.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
chro.setBase(SystemClock.elapsedRealtime());
recordtime = 0;
chro.stop();
}
});
重新计时点击后,重新设置计时开始的时间,并将记录时间的recordtime变量设为0。
另外定时器显示的时间是从Base设置的时间到当前的时间,所以当setBase()=SystemClock.elapsedRealtime()-recordtime;之后,显示的就是recordtime,相当于在当前时间之前的recordtime时间就开始计时,计时到当前时间,显示的就自然是recordtime。