App登录注册必备(二)———-倒计时
在登录或者注册页面一定会有一个发送验证码的倒计时功能,这里我封装了一个工具类,继承CountDownTimer,实现了倒计时功能
继承 CountDownTimer 需要实现的几个方法
继承 CountDownTimer 需要实现以下几个方法
@Override
public void onTick(long millisUntilFinished) {
//固定间隔被调用
}
@Override
public void onFinish() {
// 倒计时完成时被调用
}
常见的两种格式
一般发送验证码的倒计时会有两种情况:
一种是只有秒数倒计时,另一种是不仅有秒数倒计时,在秒数的后面还有文字叙述,如下所示:
53s
53s后重新发送
根据各种需求对应的构造方法
其实需求说多也不多,就下面几种情况
一、 显示秒数(回调时间为1秒)
显示60秒
对应的构造方法
/** * 构造方法 * * @param textView 需要显示倒计时的TextView * 显示60s */ public CountDownUtil(TextView textView) { this(textView, 0, 0, null); }
显示自定义秒数
对应的构造方法
/** * @param textView 需要显示倒计时的TextView * @param totalSec 自定义秒数 */ public CountDownUtil(TextView textView, int totalSec) { this(textView, totalSec, 0, null); }
二、 在显示秒数的后面加上文字(回调时间为1秒)
显示60秒+自定义文字
例: 53s后重新发送
对应的构造方法
/** * 构造方法,默认倒计时为60s * * @param textView 需要显示倒计时的TextView * @param countDownText 倒计时显示的文本,如果需要将倒计时剩余数和其他文本混合显示,需要使用格式化字符串,例如: * ‘%ds后重新发送’,显示效果:20s后重新发送 */ public CountDownUtil(TextView textView, String countDownText) { this(textView, 0, 0, countDownText); }
显示自定义秒数+自定义文字
例:123s后重新发送
对应的构造方法
/** * 构造方法,默认倒计时为60s * * @param textView 需要显示倒计时的TextView * @param countDownText 倒计时显示的文本,如果需要将倒计时剩余数和其他文本混合显示,需要使用格式化字符串,例如: * ‘%ds后重新发送’,显示效果:20s后重新发送 * @param totalSec 自定义秒数 */ public CountDownUtil(TextView textView, int totalSec, String countDownText) { this(textView, totalSec, 0, countDownText); }
三、包含前两个并且自定义回调时间
对应的构造方法
/**
* 构造方法
*
* @param textView 需要显示倒计时的TextView
* @param totalSec 倒计时秒数
* @param countDownText 倒计时显示的文本,如果需要将倒计时剩余数和其他文本混合显示,需要使用格式化字符串,例如:
* ‘%ds后重新发送’,显示效果:20s后重新发送
*/
public CountDownUtil(TextView textView, int totalSec, int countDownInterval, String countDownText) {
super(totalSec <= 0 ? DEFAULT_MILLIS_IN_FUTURE : totalSec * SECOND,
countDownInterval <= 0 ? DEFAULT_INTERVAL : countDownInterval * SECOND);
mTextView = textView;
this.countDownText = countDownText;
if (!TextUtils.isEmpty(countDownText)) {
isFormatStr = countDownText.contains("%d");
}
}
前几种的构造方法都会跳转到这个构造方法中
在回调函数中的处理
/**
* 固定间隔被调用
*
* @param millisUntilFinished
*/
@Override
public void onTick(long millisUntilFinished) {
mTextView.setEnabled(false);
mTextView.setBackgroundResource(R.drawable.bg_gray); //设置按钮为灰色,这时是不能点击的
mTextView.setTextColor(Color.BLACK);
long sec = millisUntilFinished / SECOND;
if (TextUtils.isEmpty(countDownText)) {
mTextView.setText(String.valueOf(sec) + "s");
} else if (isFormatStr) {
mTextView.setText(String.format(countDownText, sec));
}
}
/**
* 倒计时完成时被调用
*/
@Override
public void onFinish() {
mTextView.setEnabled(true);
mTextView.setText("获取验证码");
}
代码中的使用
在代码中只需要使用
CountDownUtil countDown = new CountDownUtil(mTvCountDown,"%ds后重新发送");
countDown.start();
这两句话就可以了,根据不同的需求,使用不同的构造函数
完整的Demo
工具类:
public class CountDownUtil extends CountDownTimer {
// 秒(1000毫秒)
private static final int SECOND = 1000;
// 默认总时长,,60秒
private static final long DEFAULT_MILLIS_IN_FUTURE = 60 * SECOND;
// 默认回调onTick(long)时间间隔,,默认1秒
private static final long DEFAULT_INTERVAL = SECOND;
private TextView mTextView; // 需要显示倒计时的TextView
private String countDownText; // 在倒计时期间显示的文本
private boolean isFormatStr; // 记录倒计时期间显示的文本是否包含%d
/**
* 构造方法
*
* @param textView 需要显示倒计时的TextView
* 显示60s
*/
public CountDownUtil(TextView textView) {
this(textView, 0, 0, null);
}
/**
* @param textView 需要显示倒计时的TextView
* @param totalSec 自定义秒数
*/
public CountDownUtil(TextView textView, int totalSec) {
this(textView, totalSec, 0, null);
}
/**
* 构造方法,默认倒计时为60s
*
* @param textView 需要显示倒计时的TextView
* @param countDownText 倒计时显示的文本,如果需要将倒计时剩余数和其他文本混合显示,需要使用格式化字符串,例如:
* ‘%ds后重新发送’,显示效果:20s后重新发送
*/
public CountDownUtil(TextView textView, String countDownText) {
this(textView, 0, 0, countDownText);
}
/**
* 构造方法,默认倒计时为60s
*
* @param textView 需要显示倒计时的TextView
* @param countDownText 倒计时显示的文本,如果需要将倒计时剩余数和其他文本混合显示,需要使用格式化字符串,例如:
* ‘%ds后重新发送’,显示效果:20s后重新发送
* @param totalSec 自定义秒数
*/
public CountDownUtil(TextView textView, int totalSec, String countDownText) {
this(textView, totalSec, 0, countDownText);
}
/**
* 构造方法
*
* @param textView 需要显示倒计时的TextView
* @param totalSec 倒计时秒数
* @param countDownText 倒计时显示的文本,如果需要将倒计时剩余数和其他文本混合显示,需要使用格式化字符串,例如:
* ‘%ds后重新发送’,显示效果:20s后重新发送
*/
public CountDownUtil(TextView textView, int totalSec, int countDownInterval, String countDownText) {
super(totalSec <= 0 ? DEFAULT_MILLIS_IN_FUTURE : totalSec * SECOND,
countDownInterval <= 0 ? DEFAULT_INTERVAL : countDownInterval * SECOND);
mTextView = textView;
this.countDownText = countDownText;
if (!TextUtils.isEmpty(countDownText)) {
isFormatStr = countDownText.contains("%d");
}
}
/**
* 固定间隔被调用
*
* @param millisUntilFinished
*/
@Override
public void onTick(long millisUntilFinished) {
mTextView.setEnabled(false);
mTextView.setBackgroundResource(R.drawable.bg_gray); //设置按钮为灰色,这时是不能点击的
mTextView.setTextColor(Color.BLACK);
long sec = millisUntilFinished / SECOND;
if (TextUtils.isEmpty(countDownText)) {
mTextView.setText(String.valueOf(sec) + "s");
} else if (isFormatStr) {
mTextView.setText(String.format(countDownText, sec));
}
}
/**
* 倒计时完成时被调用
*/
@Override
public void onFinish() {
mTextView.setEnabled(true);
mTextView.setText("获取验证码");
}
}
变灰的背景
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/bg_gray" />
<corners android:radius="5dp" />
</shape>
</item>
</selector>
代码中xml设置
<TextView
android:id="@+id/tv_countDown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/blue"
android:padding="10dp"
android:text="发送验证码"
android:textColor="@color/white" />
case R.id.tv_countDown:
CountDownUtil countDown = new CountDownUtil(mTvCountDown,"%ds后重新发送");
countDown.start();
break;
其中 countDown.start(); 这句话,可以放在网络接口请求成功后调用