参考:https://www.jianshu.com/p/4e5c0d58c90c
1.背景
需要做一个考试时间的倒计时,自己也有想法,但还是不想重复造轮子,直到发现除了timer之外,android还有一个
CountDownTimer。
2.效果图
3.代码
package mvp.study.skymobile.com.testandroidmethod.view;
import android.os.CountDownTimer;
/**
* Author:boshuai.li
* Time:2020/3/17 11:42
* Description: 倒计时的工具类
*/
public class PeterTimeCountRefresh extends CountDownTimer {
private OnTimerFinishListener finishListener;
private OnTimerProgressListener progressListener;
/**
* @param millisInFuture 分钟转换成 毫秒
* @param countDownInterval 计时的时间间隔
*/
public PeterTimeCountRefresh(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);//参数依次为总时长,和计时的时间间隔,要显示的按钮
}
@Override
public void onTick(long millisUntilFinished) {//计时过程显示
if (progressListener != null) {
progressListener.onTimerProgress(millisUntilFinished);
}
}
@Override
public void onFinish() {//计时完毕时触发
if (finishListener != null) {
finishListener.onTimerFinish();
}
}
/**
* 设置timer走完的回调
*/
public void setOnTimerFinishListener(OnTimerFinishListener finishListener) {
this.finishListener = finishListener;
}
/**
* 设置监听进度的
*/
public void setOnTimerProgressListener(OnTimerProgressListener progressListener) {
this.progressListener = progressListener;
}
/**
* Timer 执行完成的回调
*/
public interface OnTimerFinishListener {
void onTimerFinish();
}
/**
* Timer 进度的监听
*/
public interface OnTimerProgressListener {
void onTimerProgress(long timeLong);
}
}
4.使用方法
PeterTimeCountRefresh timer = new PeterTimeCountRefresh(musicDuration, 1000);
timer.setOnTimerProgressListener(new PeterTimeCountRefresh.OnTimerProgressListener() {
@Override
public void onTimerProgress(long timeLong) {
String text = TimeUtils.parseDuration(timeLong);
PLog.i("onTimerProgress timeLong = " + timeLong + ", text = " + text);
tv.setText(text);
}
});
timer.setOnTimerFinishListener(new PeterTimeCountRefresh.OnTimerFinishListener() {
@Override
public void onTimerFinish() {
PLog.i("onTimerFinish enter");
}
});
timer.start();
5.总结
缺点在不支持暂停和继续,只有取消操作,如果想拓展的小伙伴,可以额外增加一下功能。源码很简单,有兴趣的小伙伴也可以研究下,很有好处的。