1、AnalogClock及DigitalClock组件
2、Chronometer组件 - 定时器
Chronometer:该组件可以定时执行特定程序代码,但只能每秒执行一次,无法自行设置执行程序的时间间隔。(将要在间隔1秒时间内执行的代码放到OnChronometerTickListener方法中,通过按钮事件或其它的方式来调用start()方法、stop()方法、finish()来启动、停止、结束需要执行的代码)
示例:Chronometer幻灯图片播放
public class Main extends Activity {
private ImageView imgPhoto;
private Button btnPlay, btnStop, btnEnd;
private Chronometer croTimer;
private int count = 0;// 设置正在播放的图片数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 从资源文件中获取界面组件的ID值
imgPhoto = (ImageView) findViewById(R.id.imgPhoto);
btnPlay = (Button) findViewById(R.id.btnPlay);
btnStop = (Button) findViewById(R.id.btnStop);
btnEnd = (Button) findViewById(R.id.btnEnd);
croTimer=(Chronometer) findViewById(R.id.croTimer);
// 为各个button和Chronometer设置listener
croTimer.setOnChronometerTickListener(chroListener);
btnPlay.setOnClickListener(listener);
btnStop.setOnClickListener(listener);
btnEnd.setOnClickListener(listener);
}
private Chronometer.OnChronometerTickListener chroListener = new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
// 根据count值显示对应的图片
switch (count) {
case 0:
imgPhoto.setImageResource(R.drawable.img0);
break;
case 1:
imgPhoto.setImageResource(R.drawable.img1);
break;
case 2:
imgPhoto.setImageResource(R.drawable.img2);
break;
case 3:
imgPhoto.setImageResource(R.drawable.img3);
break;
case 4:
imgPhoto.setImageResource(R.drawable.img4);
break;
case 5:
imgPhoto.setImageResource(R.drawable.img5);
break;
}
//播放下一张图片
count++;
//取6的余数
count %= 6;
}
};
private Button.OnClickListener listener = new Button.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
// 开始
case R.id.btnPlay:
croTimer.start();
break;
// 停止
case R.id.btnStop:
croTimer.stop();
break;
// 结束
case R.id.btnEnd:
finish();
}
}
};
}
界面:
3、Timer类
Timer类:功能与Chronometer相似,但更强大,不但可以设置执行程序的时间间隔,也能指定多长时间后才开始执行。
示例:Timer秒表
public class Main extends Activity {
private Button btnStart, btnStop, btnZero, btnEnd;
private TextView textClock;
private Boolean flagStart = false;// 秒表是否启动
private int totalTime, min, sec;// 总时间、分、秒
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Timer timer = new Timer();
timer.schedule(timerTask, 0, 1000);// 延迟3秒执行Timer,间隔时间为1秒
// 获取资源文件中的界面组件
textClock = (TextView) findViewById(R.id.textClock);
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
btnZero = (Button) findViewById(R.id.btnZero);
btnEnd = (Button) findViewById(R.id.btnEnd);
// 为按钮事件增添listener
btnStart.setOnClickListener(myListener);
btnStop.setOnClickListener(myListener);
btnZero.setOnClickListener(myListener);
btnEnd.setOnClickListener(myListener);
}
//Handler对象接收消息
private Handler handler = new Handler() {
//“接收消息”
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:// timerTask的消息
sec = totalTime % 60;// 获取秒数
min = totalTime / 60;// 获取分钟数
String str = "";
if (min < 10)
str = "0" + min;// 个位分钟数补零
else
str = "" + min;
if (sec < 10)
str = str + ":0" + sec;// 个位秒数补零
else
str = str + ":" + sec;
textClock.setText(str);// 显示时间
break;
}
}
};
private TimerTask timerTask = new TimerTask() {
@Override
public void run() {
if (flagStart) {
totalTime++;// 总时间加1秒
Message message = new Message();// 传送消息给Handler
//Handler对象会根据此数值判断消息的来源对象,会执行对应的处理程序
message.what = 1;
handler.sendMessage(message);
}
}
};
// 处理按钮程序代码
private Button.OnClickListener myListener = new Button.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
// 开始
case R.id.btnStart:
flagStart = true;
break;
// 停止
case R.id.btnStop:
flagStart = false;
break;
// 归零
case R.id.btnZero:
totalTime = 0;
textClock.setText("00:00");
break;
// 结束
case R.id.btnEnd:
finish();
}
}
};
}
界面:
4、Thread