Android实现倒计时的按钮效果
最近有人问我如何实现倒计时的按钮功能,例如发送验证码,我记得有个CountDownTimer,因为好久没用过了,自己就写了一个,代码如下
newCountDownTimer(10000,1000){
@Override
publicvoidonTick(longmillisUntilFinished){
btn2.setEnabled(false);
btn2.setText(String.format("%ds后重新发送验证码",millisUntilFinished/1000));
}
@Override
publicvoidonFinish(){
btn2.setEnabled(true);
btn2.setText("发送验证码");
}
}.start();
点击按钮后开始倒计时,貌似很简单啊,但是运行起来发现有一些问题,先给大家看效果图
我们打印一下时间
这里我们可以看到8这个秒数没有出现,并且最后1秒的时间有些长,每次点击开始倒计时的时候偶尔就会出现少一个数字的问题,所以说这个东西是不精确的,网上也有很多人再说,那么有没有其他的实现思路呢?这里我们来自定义一个倒计时的按钮
publicclassTimeButtonextendsButtonimplementsView.OnClickListener{
privatelonglength=60*1000;//倒计时长度,这里给了默认60秒
privateStringtextafter="秒后重新获取";
privateStringtextbefore="点击获取验证码";
privatefinalStringTIME="time";
privatefinalStringCTIME="ctime";
privateOnClickListenermOnclickListener;
privateTimert;
privateTimerTasktt;
privatelongtime;
privateContextmContext;
Mapmap=newHashMap();
publicTimeButton(Contextcontext){
super(context);
setOnClickListener(this);
}
publicTimeButton(Contextcontext,AttributeSetattrs){
super(context,attrs);
mContext=context;
setOnClickListener(this);
}
@SuppressLint("HandlerLeak")
Handlerhan=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
TimeButton.this.setText(time/1000+textafter);
time-=1000;
if(time<0){
TimeButton.this.setEnabled(true);
TimeButton.this.setText(textbefore);
clearTimer();
}
}
};
privatevoidinitTimer(){
time=length;
t=newTimer();
tt=newTimerTask(){
@Override
publicvoidrun(){
Log.e("yung",time/1000+"");
han.sendEmptyMessage(0x01);
}
};
}
privatevoidclearTimer(){
Toast.makeText(mContext,"计时结束",Toast.LENGTH_SHORT).show();
if(tt!=null){
tt.cancel();
tt=null;
}
if(t!=null)
t.cancel();
t=null;
}
@Override
publicvoidsetOnClickListener(OnClickListenerl){
if(linstanceofTimeButton){
super.setOnClickListener(l);
}else
this.mOnclickListener=l;
}
@Override
publicvoidonClick(Viewv){
if(mOnclickListener!=null)
mOnclickListener.onClick(v);
initTimer();
this.setText(time/1000+textafter);
this.setEnabled(false);
t.schedule(tt,0,1000);
}
/**
*和activity的onDestroy()方法同步
*/
publicvoidonDestroy(){
if(MainActivity.map==null)
MainActivity.map=newHashMap();
MainActivity.map.put(TIME,time);
MainActivity.map.put(CTIME,System.currentTimeMillis());
clearTimer();
}
/**
*和activity的onCreate()方法同步
*/
publicvoidonCreate(Bundlebundle){
Log.e("yung",MainActivity.map+"");
if(MainActivity.map==null)
return;
if(MainActivity.map.size()<=0)//这里表示没有上次未完成的计时
return;
longtime=System.currentTimeMillis()-MainActivity.map.get(CTIME)
-MainActivity.map.get(TIME);
MainActivity.map.clear();
if(time>0)
return;
else{
initTimer();
this.time=Math.abs(time);
t.schedule(tt,0,1000);
this.setText(time+textafter);
this.setEnabled(false);
}
}
/**
*设置计时时候显示的文本
*/
publicTimeButtonsetTextAfter(Stringtext1){
this.textafter=text1;
returnthis;
}
/**
*设置点击之前的文本
*/
publicTimeButtonsetTextBefore(Stringtext0){
this.textbefore=text0;
this.setText(textbefore);
returnthis;
}
/**
*设置到计时长度
*
*@paramlenght时间默认毫秒
*@return
*/
publicTimeButtonsetLenght(longlenght){
this.length=lenght;
returnthis;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。