/**
利用timer和handler进行循环计数,使其操作更加方便,计时更加准确
startCountDownTime()开始计数
stop()停止计数
*/
public class CountDownTimeUtilTest {
private static CountDownTimeUtilTest countDownTimeUtil=null;
private CountDownTimeUtilTest() {
}
public static CountDownTimeUtilTest getInstance(){
if(countDownTimeUtil==null){
synchronized (CountDownTimeUtilTest.class){
if(countDownTimeUtil==null){
countDownTimeUtil=new CountDownTimeUtilTest();
}
}
}
return countDownTimeUtil;
}
private TextView tv_count_after;
//进行计算时间
public void startCountDownTime(long time1, long time2,TextView tv_count_after) {
this.tv_count_after=tv_count_after;
long day = 0;
long hour = 0;
long min = 0;
long sec = 0;
long diff=0;
if (time1 == -1 || time1 == -1) {
tv_count_after.setText("00小时00分00秒");
return;
} else if (time1 <= time2) {
diff = time2 - time1;
}else{
tv_count_after.setText("00小时00分00秒 已超时");
diff=time1 - time2;
}
// LogUtil.e("TAG", "time1==" + time1 + " time2=" + time2 + " diff=" + diff);
// 如果是10位的时间戳 就是秒 13位的浩渺
day = diff / (24 * 60 * 60);
hour = (diff / (60 * 60) - day * 24);
min = ((diff / (60)) - day * 24 * 60 - hour * 60);
sec = (diff - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
// return day + "天" + hour + "小时" + min + "分钟" + sec + "秒";
// return day + "天。";
if(time1 > time2){
// 如果超时了
return;
}
setTime((int) day, (int) hour, (int) min, (int) sec);
//在启动先进行进行停止
stop();
start();
}
// 下面是进行倒计时
private Timer timer;
private int day_decade; //天的十位
private int day_unit; //天的个位
private int hour_decade; //小时的十位
private int hour_unit; //小时的个位
private int min_decade;
private int min_unit;
private int sec_decade;
private int sec_unit;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
countDown();
}
};
private void start() {
if (timer == null) {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(0);
}
}, 0, 1000);
}
}
public void stop() {
if (timer != null) {
timer.cancel();
timer = null;
}
if (handler != null) {
handler.removeMessages(0);
}
}
//这是进行设置文字
private void setTime(int day, int hour, int min, int sec) {
if (day < 0 || hour >= 60 || min >= 60 || sec >= 60 || hour < 0 || min < 0
|| sec < 0) {
throw new RuntimeException("时间格式错误,请检查你的代码");
}
day_decade = day / 10;
day_unit = day - day_decade * 10;
hour_decade = hour / 10;
hour_unit = hour - hour_decade * 10;
min_decade = min / 10;
min_unit = min - min_decade * 10;
sec_decade = sec / 10;
sec_unit = sec - sec_decade * 10;
//设置时间
setTimeText();
}
private void countDown() {
if (isCarry4Unit(sec_unit, SECOND)) {
// LogUtil.e("TAG", "sec_unit1====" + sec_unit);
if (isCarry4Decade(sec_decade, SECOND)) {
// LogUtil.e("TAG", "sec_decade2====" + sec_decade);
if (isCarry4Unit(min_unit, MINUTE)) {
LogUtil.e("TAG", "min_unit3====" + min_unit);
if (isCarry4Decade(min_decade, MINUTE)) {
LogUtil.e("TAG", "min_decade4====" + min_decade);
if (isCarry4Unit(hour_unit, HOUR)) {
// LogUtil.e("TAG", "hour_unit5====" + hour_unit);
if (isCarry4Decade(hour_decade, HOUR)) {
// LogUtil.e("TAG", "hour_decade6====" + hour_decade);
if (isCarry4Unit(day_unit, DAY)) {
// LogUtil.e("TAG", "hour_unit7====" + hour_decade);
if (isCarry4Decade(day_decade, DAY)) {
// LogUtil.e("TAG", "hour_decade8====" + hour_decade);
// Toast.makeText(mContext, "计数完成", Toast.LENGTH_SHORT).show();
stop();
setTime(0, 0, 0, 0);//重置为0
}
}
}
}
}
}
}
}
}
private boolean isCarry4Unit(int time, int style) {
time = time - 1;
if (time < 0) {
time = 9;
setTimeFromUnit(time, style);
return true;
} else {
setTimeFromUnit(time, style);
return false;
}
}
private void setTimeFromUnit(int time, int style) {
switch (style) {
case DAY:
day_unit = time;
break;
case HOUR:
hour_unit = time;
break;
case MINUTE:
min_unit = time;
break;
case SECOND:
sec_unit = time;
break;
}
setTimeText();
}
private boolean isCarry4Decade(int time, int style) {
time = time - 1;
if (time < 0) {
time = 5;
setTimeFromDecade(time, style);
return true;
} else {
setTimeFromDecade(time, style);
return false;
}
}
private static final int DAY = 0;
private static final int HOUR = 1;
private static final int MINUTE = 2;
private static final int SECOND = 3;
private void setTimeFromDecade(int time, int style) {
switch (style) {
case DAY:
day_decade = time;
break;
case HOUR:
hour_decade = time;
break;
case MINUTE:
min_decade = time;
break;
case SECOND:
sec_decade = time;
break;
}
setTimeText();
}
private void setTimeText() {
//进行设置时间
//XX小时XX分XX秒
if (day_decade == 0 &&
day_unit == 0) {
tv_count_after.setText("" + hour_decade + hour_unit + "小时" + min_decade + min_unit + "分" + sec_decade + sec_unit + "秒");
} else {
tv_count_after.setText("" + day_decade + day_unit + "天" + hour_decade + hour_unit + "小时" + min_decade + min_unit + "分" + sec_decade + sec_unit + "秒");
}
//这是点击确定后返回的情况 我应该进行判断 如果是小于十分钟 就直接进入下一级 否则 弹窗显示
if (day_decade == 0 &&
day_unit == 0 &&
hour_decade == 0 &&
hour_unit == 0 &&
min_decade == 0 &&
min_unit == 0 &&
sec_decade == 0 &&
sec_unit == 0) {
LogUtil.e("TAG", "当前时间为0");
tv_count_after.setText("00小时00分00秒 已超时");
} else if(day_decade == 0 &&
day_unit == 0 &&
hour_decade == 0 &&
hour_unit == 0 &&
min_decade <= 2){
LogUtil.e("TAG", "当前时间小于30分钟");
}else if (day_decade == 0 &&
day_unit == 0 &&
hour_decade == 0 &&
hour_unit == 0 &&
min_decade == 0) {
// LogUtil.e("TAG", "当前时间小于十分钟");
} else {
// LogUtil.e("TAG", "当前时间大于十分钟");
}
}
}
倒计时计时器工具类
猜你喜欢
转载自blog.csdn.net/yuezheyue123/article/details/88815298
今日推荐
周排行