倒计时计时器工具类

/**
利用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