引言
通常,我们都会在各种app中发现存在需要用户输入手机号获取验证码的情况:当用户输入手机号点击后发送验证码后,“获取验证码”点击框会进入读秒倒计时,60秒之后读秒结束会出现“重新获取验证码”的点击框。
今天就来实现一下这个获取验证码倒计时的功能。需要借助CountDownTimer类。
效果预览
介绍
google官方也帮我们封装好了一个类:CountDownTimer,使我们的开发更加方便。CountDownTimer是一个抽象类,有两个抽象方法,它的API很简单。
public abstract void onTick(long millisUntilFinished);//这个是每次间隔指定时间的回调,millisUntilFinished:剩余的时间,单位毫秒
public abstract void onFinish();//这个是倒计时结束的回调,也就是倒计时结束后做的操作
用法
第一步:布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".blog.Case47"
android:background="@color/gray"
tools:ignore="MissingConstraints">
<EditText
android:id="@+id/etCheckNum"
android:layout_width="0dp"
android:layout_margin="10dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_weight="6"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/tvGetNum"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tvGetNum"
android:layout_width="0dp"
android:layout_height="50dp"
android:text="获取验证码"
android:layout_margin="10dp"
android:gravity="center"
android:background="@drawable/bg_identify_code_normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_weight="4"
app:layout_constraintLeft_toRightOf="@+id/etCheckNum"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
第二步:创建倒计时工具类
/**
* @data on 2020/10/16 6:26 PM
* @auther armstrong
* @describe 倒计时工具类
*/
public class CountDownTimerUtils extends CountDownTimer {
private TextView mTextView;
public CountDownTimerUtils(TextView textView, long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
this.mTextView = textView;
}
@Override
public void onTick(long millisUntilFinished) {
mTextView.setClickable(false); //设置不可点击
mTextView.setText(millisUntilFinished / 1000 + "秒后可重新发送"); //设置倒计时时间
mTextView.setBackgroundResource(R.drawable.bg_identify_code_press); //设置按钮为灰色,这时是不能点击的
SpannableString spannableString = new SpannableString(mTextView.getText().toString()); //获取按钮上的文字
ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(span, 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//将倒计时的时间设置为红色
mTextView.setText(spannableString);
}
@Override
public void onFinish() {
mTextView.setText("重新获取验证码");
mTextView.setClickable(true);//重新获得点击
mTextView.setBackgroundResource(R.drawable.bg_identify_code_normal); //还原背景色
}
}
第三步:在Activity中书写业务逻辑
//获取验证码倒计时功能
public class Case47 extends AppCompatActivity {
private TextView tvGetNum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_case47);
initView();
}
private void initView(){
tvGetNum = findViewById(R.id.tvGetNum);
tvGetNum.setOnClickListener((View)->{
//millisInFuture:倒计时的总时长
//countDownInterval:每次的间隔时间 单位都是毫秒
CountDownTimerUtils mCountDownTimerUtils = new CountDownTimerUtils(tvGetNum, 60000, 1000);
mCountDownTimerUtils.start();
});
}
}