Android进阶之抢购倒计时功能

1、简介

CountDownTimer 是 android 提供的一个类,其位于 android.os 包中。用 CountDownTimer 来实现倒计时,并动态显示在布局上。

参数:
countDownTimer.start();方法开始
countDownTimer.cancel();方法结束
new CountDownTimer(30000, 1000); //第一个参数表示 总的时间为30000毫秒,间隔1000毫秒

2、实现步骤

2.1、 新建 Counter类,继承 CountDownTimer,重载 onFinish() 和 onTick() 两个函数,并实现构造函数。

import android.os.CountDownTimer;

public class Counter extends CountDownTimer {

        public Counter(long millisInFuture, long countDownInterval) {
                super(millisInFuture, countDownInterval);

        }

        @Override
        public void onFinish() {

        }

        @Override
        public void onTick(long millisUntilFinished) {

        }
}

提示:
1)倒计时完成后将执行 onFinish() 函数;
2)onTick() 函数为倒计时执行时的回调函数,millisUntilFinished 为当前剩下时间,单位毫秒。

2.2、 声明全局变量

private static final int SECONDS = 60;    //秒数
private static final int MINUTES = 60 * 60;    //小时

private long first = 0, twice = 0, third = 0;
private long mtmp = 0, mtmp2 = 0;

2.3、在 onTick 函数中更新UI,并以 “00:00:00” 时分秒的格式动态显示

@Override
public void onTick(long millisUntilFinished) {
        //获取当前时间总秒数
        first = millisUntilFinished / 1000;
        if(first < SECONDS) {    //小于一分钟 只显示秒
                settext("00:00:" + (first<10?"0"+first:first));
        }else if(first < MINUTES) {    //大于或等于一分钟,但小于一小时,显示分钟
                twice = first % 60;    //将秒转为分钟取余,余数为秒
                mtmp = first/60;    //将秒数转为分钟
                if(twice==0) {
                        settext("00:" + (mtmp<10?"0"+mtmp:mtmp) + ":00");    //只显示分钟
                } else {
                        settext("00:" + (mtmp<10?"0"+mtmp:mtmp) + ":" + (twice<10?"0"+twice:twice));    //显示分钟和秒 
                }
        }else {
                twice = first % 3600;    //twice为余数 如果为0则小时为整数
                mtmp = first / 3600;
                if(twice == 0) {
                        //只剩下小时
                        settext("0" + first/3600 + ":00:00");
                }else {
                        if(twice < SECONDS) {    //twice小于60 为秒
                                settext((mtmp<10?"0"+mtmp:mtmp) + ":00:" + (twice<10?"0"+twice:twice));    //显示小时和秒
                        }else {
                                third = twice%60;    //third为0则剩下分钟 否则还有秒
                                mtmp2 = twice/60;
                                if(third == 0) {
                                        settext((mtmp<10?"0"+mtmp:mtmp) + ":" + (mtmp2<10?"0"+mtmp2:mtmp2) + ":00");
                                }else {
                                        settext((mtmp<10?"0"+mtmp:mtmp) + ":" + (mtmp2<10?"0"+mtmp2:mtmp2) + ":" + third);    //还有秒
                                }
                        }
                }
        }
}

提示:
①其中 (mtmp<10?”0”+mtmp:mtmp) 为判断当前数字是否小于10,成立则在前面加上 “0”,如 ”05“;
②settext() 为自定义函数,可通过实情况将其替换为UI更新函数,如 TextView.setText();

2.4、实例化 Counter,实现倒计时

counter = new Counter(5*60*1000, 1000);//第一个参数是倒计时时间,后者为计时间隔,单位毫秒,这里是倒计时 5 分钟,间隔1秒
counter.start();

2.5、取消倒计时

counter.cancel();

3、补充:30秒倒计时实现

package com.example.daojishi; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.CountDownTimer; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

/** * @author 冠 * 倒计时的类 CountDownTimer */
public class MainActivity extends Activity { 

  private MyCountDownTimer mc; 
  private TextView tv; 

  @Override
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tv = (TextView) findViewById(R.id.show); 
    mc = new MyCountDownTimer(30000, 1000); 
    mc.start(); 
  } 

  public void oncancel(View view) { 
    Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_LONG).show();// toast有显示时间延迟 
    mc.cancel(); 
  } 

  public void restart(View view) { 
    Toast.makeText(MainActivity.this, "重新开始", Toast.LENGTH_LONG).show();// toast有显示时间延迟 
    mc.start(); 
  } 

  /** * 继承 CountDownTimer 防范 * 重写 父类的方法 onTick() 、 onFinish() */
  class MyCountDownTimer extends CountDownTimer { 
    /** * @param millisInFuture 表示以毫秒为单位 倒计时的总数 * @param countDownInterval 表示 间隔 多少微秒 调用一次 onTick 方法 */
    public MyCountDownTimer(long millisInFuture, long countDownInterval) { 
      super(millisInFuture, countDownInterval); 
    } 

    @Override
    public void onFinish() { 
      tv.setText("done"); 
    } 

    @Override
    public void onTick(long millisUntilFinished) { 
      Log.i("MainActivity", millisUntilFinished + ""); 
      tv.setText("倒计时(" + millisUntilFinished / 1000 + ")..."); 
    } 
  } 
} 

Android进阶之抢购倒计时功能_第1张图片

你可能感兴趣的:(android)