Android实现倒计时的按钮效果

Android实现倒计时的按钮效果,第1张

概述Android实现倒计时按钮效果 最近有人问我如何实现倒计时的按钮功能,例如发送验证码,我记得有个CountDownTimer,因为好久没用过了,自己就写了一个,代码如下 new CountDownTimer(10000, 1000) { @Override public void onTick(long millisUntilFinished) { btn2.setEnabled(false); btn2.setText(String.format("%ds后重新发送验证码",millisUntilFini ...

最近有人问我如何实现倒计时的按钮功能,例如发送验证码,我记得有个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实现倒计时的按钮效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1144260.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存