
最近有人问我如何实现倒计时的按钮功能,例如发送验证码,我记得有个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,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,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; }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android实现倒计时的按钮的示例代码全部内容,希望文章能够帮你解决Android实现倒计时的按钮的示例代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)