计时器
Android提供了一个计时器组件:Chronometer,该组件与DigitalClock都继承自TextView,因此他们都会显示一段文本。但Chrnometer并不显示当前时间,它显示的是从某个起始时间开始,一共过去了多长时间。
Chronometer的用法也很简单,它只提供了一个android:format属性,用于指定计时器的计时格式。除此之外,Chronometer支持如下常用方法。
- setBase(long base):设置计时器的时间格式。
- setFormat(String format):设置显示时间的格式。
- start():开始计时
- stop():停止计时
- setOnChronemeterTickListener(Chronometer.OnChronometerTickListener listener):为计时器绑定事件监听器,当计时器改变时触发该监听器。
下面的程序简单示范了Chronometer的用法,该程序界面中定义了一个Chronometer组件和一个Button组件。当用户单击Button时系统开始计时,当计时超过20秒时停止计时。
下面是该程序的代码。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_horizontal" > <Chronometer android:id="@+id/test" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" android:textSize="14dp" /> </LinearLayout>
后台代码:
package org.crazyit.helloworld; import android.os.Bundle; import android.os.SystemClock; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.*; import android.widget.*; import android.widget.Chronometer.*; public class ChronometerTest extends Activity { Chronometer ch; Button start; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chronometer_test); //获取计时器组件 ch=(Chronometer)findViewById(R.id.test); //获取"开始"按钮 start=(Button)findViewById(R.id.start); start.setOnClickListener(new OnClickListener(){ @Override public void onClick(View source) { // TODO Auto-generated method stub //设置开始计时的时间 ch.setBase(SystemClock.elapsedRealtime()); //启动计时器 ch.start(); start.setEnabled(false); } }); //为Chronometer绑定事件监听器 ch.setOnChronometerTickListener(new OnChronometerTickListener(){ @Override public void onChronometerTick(Chronometer chronometer) { // TODO Auto-generated method stub //如果从开始计时到现在超过了20s if(SystemClock.elapsedRealtime()-ch.getBase()>20*1000) { ch.stop(); start.setEnabled(true); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.chronometer_test, menu); return true; } }
程序中用到的SystemClock类仅仅是一个获取系统时间、运行时间的工具类,用法很简单。
运行上面的Activity得到图2.28所示效果
图2.28 计时器