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

最近有人问我如何实现倒计时的按钮功能,例如发送验证码,我记得有个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;
  }
}

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

时间: 2016-12-30

Android自定义照相机倒计时拍照

自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的秒数的 相关教程:Android开发从相机或相册获取图片裁剪 Android启动相机拍照并返回图片 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&qu

Android开发之获取短信验证码后按钮背景变化并且出现倒计时

目前越来越多的app在注册或是进行对应操作时,要求获取短信验证码,在点击了获取短信验证码的按钮后,就是出现倒计时,比如倒计时120S,在倒计时期间内,按钮背景变化并且出现倒计时,当倒计时结束后,如果你没有获取到验证码,可以再次点击. 代码如下所示: VerCodeTimer mVerCodeTimer=(Button) findViewById(R.id.login_get_ver_code); private class VerCodeTimer extends CountDownTimer

android实现倒计时功能的方法

前言  在打开爱奇艺等app的欢迎界面的时候,右上角有一个倒计时的控件.倒计时完了以后进入主界面.现在我们来实现这个功能. 方法一: 利用java的类Timer,TimerTask还有android的Handler 界面welcome_activity.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.andro

Android账号注册实现点击获取验证码倒计时效果

网站中为了防止恶意获取验证短信.验证邮箱,都会在点击获取验证码的按钮上做个倒计时的效果,如何实现这个效果,具体内容如下 效果图:   代码: RegisterActivity.java import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import com.jialianjia.bzw.BaseAct

Android基于CountDownTimer实现倒计时功能

本文实例讲述了Android编程基于CountDownTimer实现倒计时功能的方法.分享给大家供大家参考,具体如下: 在逛论坛的时候,看到一个网友提问,说到了CountDownTimer这个类,从名字上面大家就可以看出来,记录下载时间.将后台线程的创建和Handler队列封装成一个方便的类调用. 查看了一下官方文档,这个类及其简单,只有四个方法,上面都涉及到了onTick,onFinsh.cancel和start.其中前面两个是抽象方法,所以要重写一下. 下面是官方给的一个小例子: new C

Android 实现闪屏页和右上角的倒计时跳转实例代码

以前编程的时候,遇到倒计时的功能时,经常自己去写,但其实Android已经帮封装好了一个倒计时类CountDownTimer,其实是将后台线程的创建和Handler队列封装成为了一个方便的类调用. 闪屏页用到了handler和CountDownTimer类,还需配置一下Activity的主题,这里是:android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 全屏主题的意思. 给大家展示下效果图: 代码如下所示: package

Android自带倒计时控件Chronometer使用方法详解

公司的以前的项目,看到使用了这个Android自带的倒计时控件Chronometer,现在整合了一下 先看看效果: <Chronometer android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="30dp" /> <Button android:onClick="start" andro

Android实现计时与倒计时的常用方法小结

本文实例总结了Android实现计时与倒计时的常用方法.分享给大家供大家参考,具体如下: 方法一 Timer与TimerTask(Java实现) public class timerTask extends Activity{ private int recLen = 11; private TextView txtView; Timer timer = new Timer(); public void onCreate(Bundle savedInstanceState){ super.onC

Android自定义Chronometer实现短信验证码秒表倒计时功能

本文实例为大家分享了Chronometer实现倒计时功能,Android提供了实现按照秒计时的API,供大家参考,具体内容如下 一.自定义ChronometerView 继续自TextView 主要原理:先设置一个基准倒计时时间mBaseSeconds,内置handler 每隔1s发送一个空消息,mRemainSeconds--,同时刷新界面视图,回调给外部调用者,只到为零.外部调用者可通过start()/pause()/stop()来控制计时器的工作状态. 可以app中发送短信验证码的场景为例

android自定义倒计时控件示例

自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.content.Context;import android.content.res.TypedArray;import android.graphics.Paint;import android.text.Html;import android.util.AttributeSet;import android.widget.TextView; import com.new0315.R;

android倒计时控件示例

本文为大家分享了android倒计时控件,供大家参考,具体代码如下 /* * Copyright (C) 2012 The * Project * All right reserved. * Version 1.00 2012-2-11 * Author veally@foxmail.com */ package com.ly.sxh.view; import android.content.Context; import android.database.ContentObserver; im

Android 倒计时控件 CountDownView的实例代码详解

一个精简可自定义的倒计时控件,使用 Canvas.drawArc() 绘制.实现了应用开屏页的圆环扫过的进度条效果. 代码见https://github.com/hanjx-dut/CountDownView 使用 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { implementation 'com.github.hanjx-dut:CountDownView:1.1'

Android倒计时控件 Splash界面5秒自动跳转

现在很多app的首页都有一个倒计时控件,比如说3秒或者5秒自动跳转界面,或者点击控件直接跳过 首先,自定义控件CircleProgressbar(参考网上资料) package com.zhoujian.mykeep.view; import android.annotation.TargetApi; import android.content.Context; import android.content.res.ColorStateList; import android.content.

Android使用属性动画如何自定义倒计时控件详解

为什么要引入属性动画? Android之前的补间动画机制其实还算是比较健全的,在android.view.animation包下面有好多的类可以供我们操作,来完成一系列的动画效果,比如说对View进行移动.缩放.旋转和淡入淡出,并且我们还可以借助AnimationSet来将这些动画效果组合起来使用,除此之外还可以通过配置Interpolator来控制动画的播放速度等等等等.那么这里大家可能要产生疑问了,既然之前的动画机制已经这么健全了,为什么还要引入属性动画呢? 其实上面所谓的健全都是相对的,如

浅谈Android RecyclerView UI的滚动控件示例

ListView 由于其强大的功能,在过去的 Andorid 开发中使用非常广泛.不过 ListView 需要优化来提升运行效率,就像我们之前所优化的那样,否则性能将很差.还有就是只能够纵向滚动,如果要想实现横向移动,用 ListView 是做不到的. RecyclerView 可以说是一个增强版的 ListView .它不仅实现了和 ListView 同样的效果,而且还优化了 ListView 存在的各种不足. RecyclerView 现在可是官方推荐使用的滚动控件哦O(∩_∩)O~ 1 基

Android自定义圆环倒计时控件

本文实例为大家分享了Android自定义圆环倒计时控件的具体代码,供大家参考,具体内容如下 先来一张最终效果图: 主要思路: 在画渐变色圆环的时候,设置一个属性动画,根据属性动画的执行时长,来作为倒计时的时长.监听属性动画的进度,来达到 倒计时的目的. 二话不说,直接贴代码.具体实现思路都在注释上. 自定义属性: <declare-styleable name="CountDownProgressBar"> <attr name="countDown_cir

Android AutoCompleteTextView控件基本用法示例

本文实例讲述了Android AutoCompleteTextView控件基本用法.分享给大家供大家参考,具体如下: 当输入部分内容之后会有相关的建议,类似于百度提示信息 1.在布局文件中声明一个AutoCompleteTextView <AutoCompleteTextView android:id="@+id/autocomplete_country" android:layout_width="fill_parent" android:layout_he

Android列表控件Spinner简单用法示例

本文实例讲述了Android列表控件Spinner简单用法.分享给大家供大家参考,具体如下: Android的Spinner控件用来显示列表项,类似于一组单选框RadioButton.这里介绍一下其简单用法: xml布局: <?xml version="1.0" encoding="utf-8"?> <LinaerLayout xmlns:android="http://schemas.android.com/apk/res/androi