序:
最近越来越多的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.源码地址
自定义倒计时控件