Android发送验证码的倒计时button

1 直接上图


2 原理

原理非常easy,就是把对应的倒计时逻辑等封装到一个控件中,并向外部提供接口。

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); // button按下时创建一个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 + "秒后 又一次获取"); 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 { /** * 点击button后,開始计时前调用的方法。 * * @return 返回true会開始计时。false会退出计时。 */ public boolean Start(); /** * 结束啦。

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

4 project下载

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

原文地址:https://www.cnblogs.com/blfbuaa/p/6781152.html