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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。