App登录注册必备(二)———-倒计时CountDownTimer

App登录注册必备(二)———-倒计时

在登录或者注册页面一定会有一个发送验证码的倒计时功能,这里我封装了一个工具类,继承CountDownTimer,实现了倒计时功能

继承 CountDownTimer 需要实现的几个方法

继承 CountDownTimer 需要实现以下几个方法

  @Override
    public void onTick(long millisUntilFinished) {
        //固定间隔被调用 
    }

    @Override
    public void onFinish() {
        //  倒计时完成时被调用
    }
常见的两种格式

一般发送验证码的倒计时会有两种情况:

一种是只有秒数倒计时,另一种是不仅有秒数倒计时,在秒数的后面还有文字叙述,如下所示:

  • 53s

  • 53s后重新发送

根据各种需求对应的构造方法

其实需求说多也不多,就下面几种情况

一、 显示秒数(回调时间为1秒)

  1. 显示60秒

    对应的构造方法

     /**
     * 构造方法
     *
     * @param textView 需要显示倒计时的TextView
     *                 显示60s
     */
    public CountDownUtil(TextView textView) {
        this(textView, 0, 0, null);
    }
    
  2. 显示自定义秒数

    对应的构造方法

    /**
     * @param textView 需要显示倒计时的TextView
     * @param totalSec 自定义秒数
     */
    
    public CountDownUtil(TextView textView, int totalSec) {
        this(textView, totalSec, 0, null);
    }

二、 在显示秒数的后面加上文字(回调时间为1秒)

  1. 显示60秒+自定义文字

    例: 53s后重新发送

    对应的构造方法

    /**
     * 构造方法,默认倒计时为60s
     *
     * @param textView      需要显示倒计时的TextView
     * @param countDownText 倒计时显示的文本,如果需要将倒计时剩余数和其他文本混合显示,需要使用格式化字符串,例如:
     *                      ‘%ds后重新发送’,显示效果:20s后重新发送
     */
    
    public CountDownUtil(TextView textView, String countDownText) {
        this(textView, 0, 0, countDownText);
    }
    
  2. 显示自定义秒数+自定义文字

    例: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(); 这句话,可以放在网络接口请求成功后调用

GitHub地址—完整代码在TestActivity中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值