最近在项目中遇到了一个需要实时更新时间的需求,并且用的地方还是挺多的,无奈做了一个简单的view来时现这个数字时钟。
首先看一下效果,比较简单,就是显示时分秒。
实现思路比较简单,利用handler的延时发送来实现事件的实时更新。
1.因为现实的最终效果只是一个字符,所以就直接继承TextView来实现时间的展示,代码如下
在初始化的时候直接将当前对象最为最终的显示对象,
2。因为最终显示的是事件,我们要获取当前的时间,
这里我用的是Calendar来实现获取当前的时间,当然获取时间的方式有很多种,你都可以用,
3.获取时间后,如果要实时的更新时间,则我们需要每秒都获取一次时间,我们要开启一个子线程,在子线程中做我们的实时操作,
在init方法中,我们先获取当前的时间,然后再开启一个子线程进行实时更新操作,
4.实时更新操作通过handler的延时发送消息来实现,
我们可以看到通过post方法来发送一个延时消息,最后在handleMessage方法中做消息的处理,然后再发送消息,这样就实现了无限循环,进而实现时间的实时更新,
以上就是实现一个简单的数字时间显示器的代码,比较简单,下面直接贴上代码,
public classCustomTimeViewextendsTextView{
private finalCustomTimeViewtextView;
privateStringtime;
privateTimeHandlermTimehandler=newTimeHandler();
publicCustomTimeView(Context context) {
this(context,null);
}
publicCustomTimeView(Context context,AttributeSet attrs) {
super(context,attrs);
this.textView=this;
init(context);
}
private voidinit(Context context) {
try{
//初始化textview显示时间
updateClock();
//更新进程开始
newThread(newRunnable() {
@Override
public voidrun() {
mTimehandler.startScheduleUpdate();
}
}).start();
}catch(Exception e){
e.printStackTrace();
}
}
//更新Handler通过handler的延时发送消息来更新时间
private classTimeHandlerextendsHandler {
private booleanmStopped;
private voidpost(){
//每隔1秒发送一次消息
sendMessageDelayed(obtainMessage(0),1000);
}
@Override
public voidhandleMessage(Message msg) {
super.handleMessage(msg);
if(!mStopped){
updateClock();
//实现实时更新
post();
}
}
//开始更新
public voidstartScheduleUpdate(){
mStopped=false;
post();
}
//停止更新
public voidstopScheduleUpdate(){
mStopped=true;
removeMessages(0);
}
}
//返回当前的时间,并结束handler的信息发送
publicStringgetTime(){
//停止发送消息
mTimehandler.stopScheduleUpdate();
returntime;
}
private voidupdateClock() {
//获取当前的时间
Calendar calendar= Calendar.getInstance();
inthour=calendar.get(Calendar.HOUR_OF_DAY);
intminute=calendar.get(Calendar.MINUTE);
intsecond=calendar.get(Calendar.SECOND);
String s="";
String m="";
String h="";
if(hour<10){
h="0"+hour;
}else{
h=hour+"";
}
if(minute<10){
m="0"+minute;
}else{
m=minute+"";
}
if(second<10){
s="0"+second;
}else{
s=second+"";
}
time=h+":"+m+":"+s;
textView.setText(time);
}
}
直接粘贴以上代码就可以使用了。