Android发送验证码的倒计时按钮

1 直接上图

2 原理

原理很简单,就是把相应的倒计时逻辑等封装到一个控件中,并向外部提供接口。

3 代码

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;

/**
 * 自定义控件,实现倒计时功能。
 *
 * @author Admin
 *
 */
public class DaoJiShi extends FrameLayout {

	private static final int jishi = 0x000;
	private SmartButton9 daojishi;
	private Handler handler;
	private Timer timer;
	private int allTime = 50;
	private DaoJiShiCallBack daojishicallback;

	public DaoJiShi(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		inflater.inflate(R.layout.daojishi, this);
		initView();
		initHandler();
		initListerner();
	}

	public DaoJiShi(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		inflater.inflate(R.layout.daojishi, this);
		initView();
		initHandler();
		initListerner();
	}

	public DaoJiShi(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		inflater.inflate(R.layout.daojishi, this);
		initView();
		initHandler();
		initListerner();
	}

	public void initView() {
		daojishi = (SmartButton9) findViewById(R.id.daojishi_btn);
	}

	public void initListerner() {
		daojishi.setMyOnClick(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (daojishicallback != null) {
					if (daojishicallback.Start()) {
						// 手机号验证通过了,那么继续下面的操作。
					} else {
						// 手机号验证未通过,直接返回了,不执行下面的操作。
						return;
					}
				} else {
					// 回调接口为空,有问题,直接返回了,不执行下面的操作。
					return;
				}
				daojishi.setClickable(false);
				// 按钮按下时创建一个Timer定时器
				timer = new Timer();
				// 创建一个TimerTask
				// TimerTask是个抽象类,实现了Runnable接口,所以TimerTask就是一个子线程
				TimerTask timerTask = new TimerTask() {
					// 倒数allTime秒,默认50秒。
					int i = allTime;

					@Override
					public void run() {
						// Log.d("debug", "run方法所在的线程:"
						// + Thread.currentThread().getName());
						// 定义一个消息传过去
						Message msg = new Message();
						msg.what = i--;
						handler.sendMessage(msg);
						if (i < 0) {
							cancel();
						}
					}
				};
				// 定义计划任务,根据参数的不同可以完成以下种类的工作:
				// 1.schedule(TimerTask task, Date when) ー> 在固定时间执行某任务
				// 2.schedule(TimerTask task, Date when, long
				// period) ー> 在固定时间开始重复执行某任务,重复时间间隔可控
				// 3.schedule(TimerTask task, long delay) ー> 在延迟多久后执行某任务
				// 4.schedule(TimerTask task, long delay, long
				// period) ー> 在延迟多久后重复执行某任务,重复时间间隔可控
				timer.schedule(timerTask, 1, 1000);// 3秒后开始倒计时,倒计时间隔为1秒
			}
		});
	}

	public void initHandler() {
		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				super.handleMessage(msg);
				daojishi.setText(msg.what + "秒后\n重新获取");
				if (daojishicallback != null) {
					daojishicallback.numChanged(msg.what);
				}
				if (msg.what == 0) {
					daojishi.setText("获取验证码");
					daojishi.setClickable(true);
					if (daojishicallback != null) {
						daojishicallback.End();
					}
				}
			}
		};
	}

	public void stop() {
		timer.cancel();
		daojishi.setText("获取验证码");
		daojishi.setClickable(true);
	}

	public void start() {
		daojishi.performClick();
	}

	public void setDaojishicallback(DaoJiShiCallBack daojishicallback) {
		this.daojishicallback = daojishicallback;
	}

	public void setAllTime(int allTime) {
		this.allTime = allTime;
	}

	/**
	 * 倒计时控件回调外部代码的接口。
	 *
	 * @author Admin
	 *
	 */
	public interface DaoJiShiCallBack {

		/**
		 * 点击按钮后,开始计时前调用的方法。
		 *
		 * @return 返回true会开始计时,false会退出计时。
		 */
		public boolean Start();

		/**
		 * 结束啦。
		 */
		public void End();

		/**
		 * 数字发生变化了。
		 *
		 * @param num
		 * @return
		 */
		public void numChanged(int num);

	}

}

4 工程下载

http://download.csdn.net/detail/zhounanzhaode/8986391

版权声明:本文为博主原创或翻译文章,未经博主允许不得转载。

时间: 2024-08-17 18:19:09

Android发送验证码的倒计时按钮的相关文章

jquery实现手机发送验证码的倒计时代码(转)

var wait = 60;//时间 function time(o, p) {//o为按钮的对象,p为可选,这里是60秒过后,提示文字的改变 if (wait == 0) { //o.removeAttr("disabled"); //o.val("点击发送验证码");//改变按钮中value的值 //p.html("如果您在1分钟内没有收到验证码,请检查您填写的手机号码是否正确或重新发送"); $('#'+p).removeAttr(&quo

Android获取验证码后倒计时程序

在开发是经常会遇到获取短信验证码,然后获取验证码后需要等待1分钟倒计时,这是是不能再次发送短信请求的,这是需要一个倒计时程序 这里我封装了一个Util类,希望对开发的小伙伴能有帮助, public class TimeCountUtil extends CountDownTimer { private Activity mActivity; private Button btn;//按钮 // 在这个构造方法里需要传入三个参数,一个是Activity,一个是总的时间millisInFuture,

jQuery实现发送验证码30s倒计时,且刷新页面时有效

在这里讲一讲这个案例的实现思路吧(个人见解)..核心思想:为防止页面刷新时倒计时失效的解决方案是:当每次刷新一次页面时都执行一个函数 即下面讲到的 setStyle() 函数.这个函数会根据当前的 cookie 值判断 是否处于倒计时阶段 ,因为 cookie 值不会随着 网页的刷新而改变. 最后面已附上全部代码可直接复制下来借鉴一下. 1.本案例用到了 jQuery,第一步:页面引入 jQuery. <script src="https://cdn.bootcss.com/jquery/

jQuery实现的手机发送验证码倒计时效果代码分享

这是一款基于jquery实现的手机发送验证码倒计时效果代码,可实现实时显示秒数倒计时的功能,还可实现对手机号码格式验证的功能,是一款常用的网站注册发送手机验证码特效代码. 效果描述:注册一个网站,当需要发送验证码到手机上的时候,我们经常碰到这样的效果:首先检测手机是否符合1开头,11位数字的格式:若不符合,则提示错误信息并返回false:否则提交给后台,后台确定接收后返回一个值,发送按钮变为灰色并倒计时. 运行效果: 年利率高达14.4% 上海投融理财,20万起投,年化收益14.4% 房产抵押,

js实现发送验证码倒计时按钮

在写注册页面时,有时候需要发送注册邮件来获取验证码,但是为了防止多次重复发送邮件, 必须让按钮隔一段时间后才能再次使用. 代码如下: 1 <html> 2 <head> 3 <meta charset="utf-8"> 4 <title>验证码按钮</title> 5 </head> 6 <body> 7 <button type="button" id="send&

Android开发:验证码倒计时功能实现

前言 现在好多个APP里面都有验证码倒计时按钮,实现方式大概有下面几种: 1.使用线程和Handler的方式,定时刷新倒计时数字,这种方式容易导致内存泄露,所以一般都使用弱引用,控制数字的刷新. 2.自定义倒计时按钮 3.使用Android提供的CountDownTimer结合TextView实现倒计时功能 这篇主要就是说下用第三种方式实现,简单好用 效果图 实现 以下是核心代码: /** * Created by hfs on 2017/5/9. */ public class TimeCou

react native中的聊天气泡以及timer封装成的发送验证码倒计时

今天看来情书写的文章,研究了一下大佬写的文章,自己做一点总结. 其实,今天我想把我近期遇到的坑都总结一下:1.goBack的跨页面跳转,又两种方法,一可以像兔哥那样修改navigation源码,二可以用navigationActions     2.父子组件的传值,一可以用callBack  二可以用pubsub发布订阅模式 三可以用manager事件监听(a页面要显示的内容 有两种形式,一是从manager主动接收,也就是说不需要点击什么的获取数据,而是时时监听manager里数据的变化,第二

发送验证码倒计时

//倒计时-(void)startTime{        //重新发送验证码    NSDictionary *dic = @{@"mobileNumber":self.phoneNumber};    [HttpTool1 post:GetRegVerificationCodeUrl params:dic success:^(id mydata) {        NSLog(@"成功----");        NSString *str = [[NSStri

iOS 短信验证码倒计时按钮的实现

验证码倒计时按钮的应用是非常普遍的,本文介绍了IOS实现验证码倒计时功能,点击获取验证码,进入时间倒计时,感兴趣的小伙伴们可以参考一下: 实现思路: 创建按钮,添加点击方法: 用NSTimer定时器,每秒执行一次,定时改变Button的title,改变Button的样式,设置Button不可点击: 若倒计时结束,定时器关闭,并改变Button的样式,可以点击: 代码如下: 在按钮的点击事件里调用该方法      -(void)openCountdown{ __block NSInteger ti