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 + "秒后\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 { /** * 点击button后,開始计时前调用的方法。 * * @return 返回true会開始计时。false会退出计时。 */ public boolean Start(); /** * 结束啦。
*/ public void End(); /** * 数字发生变化了。 * * @param num * @return */ public void numChanged(int num); } }
4 project下载