序:

最近越来越多的APP都是用手机号注册,一是为了方便用户记忆,二是为了增加用户账户的安全性。在我们进行交易操作或者修改密码等操作的时候,这时候需要输入短信验证码。这个控件会需要有倒计时的功能,这里主要总结常见的几种实现方式。

1.Android中实现倒计时的方法

第一种:直接用Handler的消息机制来实现

这种方式感觉是最原始的,这里不多说。

第二种:Timer和TimerTask

基本使用:获得Timer和TimerTask对象,然后启动,倒计时的逻辑写在handler里面

private Timer mTimer=new Timer();    

private TimerTask mTimerTask= new TimerTask() {

@Override

public void run() {

mHandler.sendEmptyMessage(COUNTTIME);

}

};

// 倒计时任务启动 

mTimer.schedule(mTimerTask, 0, mOnetime);

这里要注意资源的释放:在适当的地方清空资源

/*** 清除时间*/ 

private void clearTimer() {

if (mTimerTask != null) {

mTimerTask.cancel();

mTimerTask = null;

}

if (mTimer != null) {

mTimer.cancel();

mTimer = null;

}

}

第三种:直接使用Android自带的原生倒计时类(也是利用Handler来实现的)

btnGetVerificationCode.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 这个是原生的倒计时类,第一个参数是总毫秒数,第二个是倒计时的毫秒数。

new CountDownTimer(10000, 1000) {

@Override

public void onTick(long millisUntilFinished) {

// 倒计时中的方法

btnGetVerificationCode.setEnabled(false);

btnGetVerificationCode.setText(millisUntilFinished / 1000 + "秒");

}

@Override

public void onFinish() {

// 倒计时结束后的方法

btnGetVerificationCode.setEnabled(true);

btnGetVerificationCode.setText("重复获取验证码");

}

}.start();// 开始倒计时的方法

}

});

这种方式,看起来是最简单的,可是有几个明显的缺陷:

1.倒计时一开始显示的秒数可能不准确

2.倒计时的过程中可能丢失一秒 

3.倒计时的最后显示“1秒”,然后会卡顿1秒,并不是所期望的0秒。卡顿1秒以后才显示。

2.商城倒计时库

这里推荐一个github上的商品倒计时库:商品倒计时库

3.自定义的倒计时控件

为了简化倒计时控件的使用,参考商品倒计时库,编写了一个自定义控件。效果如下





具体的实现原理是:继承TextView,重新onTouch()方法,使用Timer来进行倒计时。

4.自定义倒计时控件基本使用

第一步:在布局中添加该控件:

<android:id="@+id/MSGCTV"

android:layout_width="wrap_content"

android:layout_gravity="center_horizontal"

android:layout_height="wrap_content"

android:padding="16dp"/>

第二步:在合适的地方加入

msgCountTimeView.isAllowRun(true);//允许开始倒计时

部分API的说明

countTimeView.setTotaltime(10000);//设置总时间,单位是毫秒

setInittext("")//设置初始化的文字

setPrefixRuntext("代码剩余时间")//设置运行时的文字的前缀

setSuffixRuntext("")//设置运行时的文字的后缀

setFinishtext("代码重新获取")//设置结束后的文字

setTimeColor(color.blueLight);//设置运行时秒数的颜色

5.源码地址

自定义倒计时控件