Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android發送驗證碼的倒計時按鈕

Android發送驗證碼的倒計時按鈕

編輯:關於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 + 秒後
重新獲取);
				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);

	}

}

 
 

版權聲明:本文為博主原創或翻譯文章,未經博主允許不得轉載。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved