欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现倒计时的按钮的示例代码

程序员文章站 2024-02-22 11:34:29
最近有人问我如何实现倒计时的按钮功能,例如发送验证码,我记得有个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();

点击按钮后开始倒计时,貌似很简单啊,但是运行起来发现有一些问题,先给大家看效果图

Android实现倒计时的按钮的示例代码

我们打印一下时间

Android实现倒计时的按钮的示例代码

这里我们可以看到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;
  }
}

Android实现倒计时的按钮的示例代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。