編輯:關於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.0 日期:2014.8.6版權:© 2014 kince 轉載注明出處 使用過蘑菇街的用戶基本上都知道有一個加入購物車的動畫效果,此處不具體描述想知道
根據Crittercism 發布的《移動體驗基准測試報告(需要注冊)》,研究人員在2582款設備上測試了106種操作系統和691個網絡運營商,結果顯示And
之前一篇文章研究完橫向二級菜單,發現其中使用了SparseArray去替換HashMap的使用.於是乎自己查了一些相關資料,自己同時對性能進行了一些測試。首先先說一下Sp
1. 工具包文件 2. build-signer.xml文件<project name="jarsigner" def