標籤: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 stubLayoutInflater 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 stubLayoutInflater 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 stubLayoutInflater 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (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;@Overridepublic 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() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.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發送驗證碼的倒計時按鈕