android开发过程存在一些场景需要使用到倒计时,最近遇到一个简单的功能便是,按钮在点击后的一分钟中内不允许点击,一分钟后就可以了。其实实现起来还是很简单的,实现方式也有很多。这里主要说一下,利用android提供的CountDownTimer类来实现简单的倒计时功能,先简单看一下效果图吧:

android 按钮倒计时 android实现倒计时_android倒计时

废话不多说,直接看下代码,如下:


public class MainActivity extends AppCompatActivity {

    private TextView mTvTime;
    private CountDownTimer mCountDownTimer;
    private int     num     = 60;       //倒计时总时长
    private boolean isStart =true;
    private Button mBtnStart;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //防止回到桌面后再点击应用图标后再重启应用,当然也可以设置启动模式为singleTask
        if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){
            finish();
            return;
        }
        setContentView(R.layout.activity_main);
        initView();
        Log.e("zxh","onCreate==");
    }

    private void initView() {
        mTvTime = (TextView) findViewById(R.id.tv_time);
        mBtnStart = (Button) findViewById(R.id.btn_start);
    }

    private void initData() {
        //初始化倒计时类,第一个参数为总的倒计时时长,第二个为间隔时长
        mCountDownTimer = new CountDownTimer((num+ 2)*1000, 1000) {  //加2是为了倒计时能显示到0
            @Override
            public void onTick(long millisUntilFinished) {      //每隔相应间隔时间回调一次
                mTvTime.setText(num + "");
                Log.e("zxh","num==" + num);
                if (num==0){
                    mBtnStart.setText("重新开始");
                    isStart = true;
                    num=60;
                }else {
                    num--;
                }
            }

            @Override
            public void onFinish() {    //倒计时结束的回调
                Log.e("zxh","倒计时结束了...num==" + num);
            }
        };
    }

    /**
     * 开始倒计时
     * @param view
     */
    public void start(View view){
        if (isStart){        //如果是开始状态点击开始计时,文字变为暂停
            mBtnStart.setText("暂停");
            Log.e("zxh","点击开始。。num==" + num);
            initData();
            mCountDownTimer.start();
            isStart = false;
        }else{              //暂停状态点击则停止计算,文字变为开始
            mCountDownTimer.cancel();
            mBtnStart.setText("开始");
            num++;          //停止计算的时候要将数据+1,因为onTick回调函数已-1了
            isStart = true;
        }

    }

    /**
     * 重新倒计时
     * @param view
     */
    public void replay(View view){
        if (mCountDownTimer != null){
            mCountDownTimer.cancel();
            num= 60;
            initData();
            mCountDownTimer.start();
            mBtnStart.setText("暂停");
            isStart = false;
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("zxh","onDestroy==mCountDownTimer==" + mCountDownTimer);
        //因为CountDownTimer是在后台开启了一个线程,为了减少消耗,退出时取消倒计时。
        if (mCountDownTimer != null){
            mCountDownTimer.cancel();
        }
    }
}



这里要注意几点:

1.CountDownTimer这个类会开启一个后台线程去倒计时,如果不cancel掉,会一直到后台倒计时,直到结束;

2.点击计时开始、暂停、重新时,简单逻辑的处理需要理清,具体看代码里注释。