Android实现倒计时的按钮的示例代码
程序员文章站
2024-02-24 23:11:40
最近有人问我如何实现倒计时的按钮功能,例如发送验证码,我记得有个countdowntimer,因为好久没用过了,自己就写了一个,代码如下
new countdo...
最近有人问我如何实现倒计时的按钮功能,例如发送验证码,我记得有个countdowntimer,因为好久没用过了,自己就写了一个,代码如下
new countdowntimer(10000, 1000) { @override public void ontick(long millisuntilfinished) { btn2.setenabled(false); btn2.settext(string.format("%ds后重新发送验证码",millisuntilfinished/1000)); } @override public void onfinish() { btn2.setenabled(true); btn2.settext("发送验证码"); } }.start();
点击按钮后开始倒计时,貌似很简单啊,但是运行起来发现有一些问题,先给大家看效果图
我们打印一下时间
这里我们可以看到8这个秒数没有出现,并且最后1秒的时间有些长,每次点击开始倒计时的时候偶尔就会出现少一个数字的问题,所以说这个东西是不精确的,网上也有很多人再说,那么有没有其他的实现思路呢?这里我们来自定义一个倒计时的按钮
public class timebutton extends button implements view.onclicklistener { private long length = 60 * 1000;// 倒计时长度,这里给了默认60秒 private string textafter = "秒后重新获取"; private string textbefore = "点击获取验证码"; private final string time = "time"; private final string ctime = "ctime"; private onclicklistener monclicklistener; private timer t; private timertask tt; private long time; private context mcontext; map<string, long> map = new hashmap<string, long>(); public timebutton(context context) { super(context); setonclicklistener(this); } public timebutton(context context, attributeset attrs) { super(context, attrs); mcontext = context; setonclicklistener(this); } @suppresslint("handlerleak") handler han = new handler() { public void handlemessage(android.os.message msg) { timebutton.this.settext(time / 1000 + textafter); time -= 1000; if (time < 0) { timebutton.this.setenabled(true); timebutton.this.settext(textbefore); cleartimer(); } } }; private void inittimer() { time = length; t = new timer(); tt = new timertask() { @override public void run() { log.e("yung", time / 1000 + ""); han.sendemptymessage(0x01); } }; } private void cleartimer() { toast.maketext(mcontext, "计时结束", toast.length_short).show(); if (tt != null) { tt.cancel(); tt = null; } if (t != null) t.cancel(); t = null; } @override public void setonclicklistener(onclicklistener l) { if (l instanceof timebutton) { super.setonclicklistener(l); } else this.monclicklistener = l; } @override public void onclick(view v) { if (monclicklistener != null) monclicklistener.onclick(v); inittimer(); this.settext(time / 1000 + textafter); this.setenabled(false); t.schedule(tt, 0, 1000); } /** * 和activity的ondestroy()方法同步 */ public void ondestroy() { if (mainactivity.map == null) mainactivity.map = new hashmap<string, long>(); mainactivity.map.put(time, time); mainactivity.map.put(ctime, system.currenttimemillis()); cleartimer(); } /** * 和activity的oncreate()方法同步 */ public void oncreate(bundle bundle) { log.e("yung", mainactivity.map + ""); if (mainactivity.map == null) return; if (mainactivity.map.size() <= 0)// 这里表示没有上次未完成的计时 return; long time = 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); } } /** * 设置计时时候显示的文本 */ public timebutton settextafter(string text1) { this.textafter = text1; return this; } /** * 设置点击之前的文本 */ public timebutton settextbefore(string text0) { this.textbefore = text0; this.settext(textbefore); return this; } /** * 设置到计时长度 * * @param lenght 时间 默认毫秒 * @return */ public timebutton setlenght(long lenght) { this.length = lenght; return this; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。