码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-08-10 18:10:26      阅读:227      评论:0      收藏:0      [点我收藏+]

标签: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

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

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

标签:android   验证码   倒计时   

原文地址:http://blog.csdn.net/zhounanzhaode/article/details/47401321

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!