创建CountDownTimerUtils 传入TextView , 倒计时总时间,倒计时触发频率
<code>
CountDownTimerUtils mCountDownTimerUtils = new CountDownTimerUtils(TextView, 60000,1000);
mCountDownTimerUtils.start();
或者直接new CountDownTimer(6000, 1000)
CountDownTimer countDownTimer= new CountDownTimer(6000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
//millisUntilFinished 倒计时剩余时间
}
@Override
public void onFinish() {
//倒计时结束
}
};
//启动倒计时
countDownTimer.start();
<code>
time.gif
继承CountDownTimer onTick 根据传入的倒计时频率触发改方法(频繁触发),onFinish倒计时结束触发该方法
<code>
import android.widget.TextView;
import com.app.framework.R;
public class CountDownTimerUtils extends CountDownTimer {
private TextView mTextView;
/**
*
* @param textView 控制的View
* @param millisInFuture 开始时间
* @param countDownInterval 倒计时触发频率
*/
public CountDownTimerUtils(TextView textView, long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
this.mTextView = textView;
}
/**
*
* @param millisUntilFinished 剩余时间
*/
@Override
public void onTick(long millisUntilFinished) {
mTextView.setClickable(false); //设置不可点击
mTextView.setText(millisUntilFinished / 1000 +""); //设置倒计时时间
mTextView.setBackgroundResource(R.drawable.gray_bg); //设置按钮为灰色,这时是不能点击的
}
/**
* 倒计时结束
*/
@Override
public void onFinish() {
mTextView.setText("获取验证码");
mTextView.setClickable(true);//重新获得点击
mTextView.setBackgroundResource(R.drawable.blue_bg); //还原背景色
}
}
</code>
通过Handler实现倒计时 提供抽象方法 onTick(频繁触发) ,onFinish(倒计时结束触发) 提供给外部
<code>
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
public abstract class CountDownTimer {
/**
* 倒计时总时间
*/
private final long mMillisInFuture;
/**
* 倒计时 频率 时间
*/
private final long mCountdownInterval;
/**最大时间*/
private long mStopTimeInFuture;
/**
* 当前倒计时的状态 默认false 结束状态
*/
private boolean mCancelled = false;
/**
* @param millisInFuture 开始的时间
* @param countDownInterval 倒计时触发频率
*/
public CountDownTimer(long millisInFuture, long countDownInterval) {
mMillisInFuture = millisInFuture;
mCountdownInterval = countDownInterval;
}
/**
* 取消倒计时
*/
public synchronized final void cancel() {
mCancelled = true;
mHandler.removeMessages(MSG);
}
/**
* 开始倒计时
*/
public synchronized final CountDownTimer start() {
mCancelled = false;
if (mMillisInFuture <= 0) {
onFinish();
return this;
}
/**计算停止时间=系统运行时间+传入时间*/
mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
mHandler.sendMessage(mHandler.obtainMessage(MSG));
return this;
}
/**
* 倒计时剩余时间
* @param millisUntilFinished 剩余时间
*/
public abstract void onTick(long millisUntilFinished);
/**
* 倒计时结束
*/
public abstract void onFinish();
private static final int MSG = 1;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
synchronized (this) {
/**判断倒计时是否结束 如果结束 直接结束*/
if (mCancelled) {
return;
}
/**获取剩余时间*/
final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
/**剩余时间小于或者等于0 调用onFinish() 代表倒计时结束*/
if (millisLeft <= 0) {
onFinish();
} else if (millisLeft < mCountdownInterval) {
/**剩余时间小于 倒计时频率时间 发送结束消息*/
sendMessageDelayed(obtainMessage(MSG), millisLeft);
} else {
/**获取当前运行的时间*/
long lastTickStart = SystemClock.elapsedRealtime();
/**调用onTick 方法 将剩余时间交给外部扩展*/
onTick(millisLeft);
/**考虑到用户的onTick花时间去执行计算执行onTick的时间*/
long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();
/**用户执行onTick方法的时间超过的倒计时频率时间 如果执行时间大于1秒 发送消息就时间就改为 onTick 执行时间+倒计时频率时间 相当于倒计时频率时间减去onTick已经消耗的时间 */
while (delay < 0) delay += mCountdownInterval;
/**发送消息 delay毫秒 */
sendMessageDelayed(obtainMessage(MSG), delay);
}
}
}
};
}
</code>
网友评论