时分秒倒计时有暂停功能

今天需要实现的是一个时分秒的倒计时功能。本来之前写过类似限时抢购的功能,想直接引用过来,发现还是不好复用,需要再加深理解下。使用CountDownTimer实现倒计时的功能,主要的逻辑就是“/”和“%”的道道。比较优雅好理解。。。

这里写图片描述

1、初始化倒计时

  /**
     * 初始化倒计时
     *
     * @param second
     */
    private void initCountDownTimer(int second) {
        //初始化定时器
        mCountDownTimer = new CountDownTimer(second * 1000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                tvTime.setText(formatLongToTimeStr(millisUntilFinished / 1000));
                remainSecond = (int) (millisUntilFinished / 1000);
            }

            @Override
            public void onFinish() {
                tvTime.setText("00:00:00");
            }
        };
    }

2、暂停的思路就是取消这个计时器。重新new新开一个mCountDownTimer.cancel();和start就是定时器的开关。

3、时间处理总秒数,返回的一点点逻辑

 public String formatLongToTimeStr(long time) {
        int hour = 0;
        int min = 0;
        int second;
        second = (int) time;
        if (second > 60) {
            min = second / 60;
            second = second % 60;
        }
        if (min > 60) {
            hour = min / 60;
            min = min % 60;
        }
        return (hour < 10 ? "0" + hour : hour) + ":" + (min < 10 ? "0" + min : min) + ":" + (second < 10 ? "0" + second : second);

    }

4、完整代码如果需要的话(那个dialog就是返回个设定的时间长度):

package com.xxx.xxx.ui.practice;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;

import com.jmsht.xxx.app.R;
import com.jmsht.xxx.app.core.utils.PreferencesHelper;
import com.jmsht.xxx.base.BaseActivity;
import com.jmsht.xxx.components.SetTimeDialog;
import com.jmsht.xxx.utils.common.User;

import butterknife.BindView;
import butterknife.OnCheckedChanged;
import butterknife.OnClick;

/**
 * Created by zsj on 2017/6/19.
 * Description xxx主页面
 */

public class SitMeditationActivity extends BaseActivity {

    //倒计时
    @BindView(R.id.tv_time)
    TextView tvTime;
    @BindView(R.id.tv_clear)
    TextView tvClear;
    @BindView(R.id.chk_music)
    CheckBox chkMusic;
    @BindView(R.id.iv_start)
    ImageView ivStart;
    @BindView(R.id.iv_pause)
    ImageView ivPause;
    @BindView(R.id.iv_sitbackto)
    ImageView ivSitbackto;
    @BindView(R.id.tv_clock)
    TextView tvClock;
    @BindView(R.id.tv_situation)
    TextView tvSituation;
    @BindView(R.id.headtopimage2)
    ImageView headtopimage2;
    @BindView(R.id.headtoptext)
    TextView headtoptext;
    @BindView(R.id.headtoptext2)
    TextView headtoptext2;
    private PreferencesHelper ph;
    private CountDownTimer mCountDownTimer;
    private int remainSecond;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initData();
    }

    private void initData() {
        headtoptext.setText(R.string.sitmeditation);
        headtoptext2.setVisibility(View.VISIBLE);
        headtoptext2.setText(R.string.share);
        ph = new PreferencesHelper(this, User.login);
        //读取之前的
        tvTime.setText(formatLongToTimeStr(ph.getValueInt("sitmeditationtime")));
    }

    /**
     * 初始化倒计时
     *
     * @param second
     */
    private void initCountDownTimer(int second) {
        //初始化定时器
        mCountDownTimer = new CountDownTimer(second * 1000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                tvTime.setText(formatLongToTimeStr(millisUntilFinished / 1000));
                remainSecond = (int) (millisUntilFinished / 1000);
            }

            @Override
            public void onFinish() {
                tvTime.setText("00:00:00");
            }
        };
    }


    public String formatLongToTimeStr(long time) {
        int hour = 0;
        int min = 0;
        int second;
        second = (int) time;
        if (second > 60) {
            min = second / 60;
            second = second % 60;
        }
        if (min > 60) {
            hour = min / 60;
            min = min % 60;
        }
        return (hour < 10 ? "0" + hour : hour) + ":" + (min < 10 ? "0" + min : min) + ":" + (second < 10 ? "0" + second : second);

    }

    @OnClick({R.id.iv_start, R.id.iv_pause, R.id.iv_sitbackto, R.id.tv_clear, R.id.tv_situation, R.id.tv_clock, R.id.headtopimage2})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.iv_start:
                //倒计时结束
                if (ph.getValueInt("sitmeditationtime") == 0) {
                    tvClear.setVisibility(View.INVISIBLE);
                    SetTimeDialog dialog = new SetTimeDialog(SitMeditationActivity.this) {
                        @Override
                        protected void sureClick(int time) {
                            ph.setValue("sitmeditationtime", time * 60);//存储时间
                            initCountDownTimer(time * 60);
                            mCountDownTimer.start();
                            tvClear.setVisibility(View.VISIBLE);
                            //直接开始
                            ivStart.setVisibility(View.GONE);
                            ivPause.setVisibility(View.VISIBLE);
                            ivSitbackto.setVisibility(View.VISIBLE);
                            dismiss();
                        }
                    };
                    dialog.show();
                } else {
                    tvClear.setVisibility(View.VISIBLE);
                    //表示存过,之前是暂停的状态
                    initCountDownTimer(ph.getValueInt("sitmeditationtime"));
                    mCountDownTimer.start();
                    ivStart.setVisibility(View.GONE);
                    ivPause.setVisibility(View.VISIBLE);
                    ivSitbackto.setVisibility(View.VISIBLE);
                }
                break;
            case R.id.iv_pause:
                mCountDownTimer.cancel();
                ph.setValue("sitmeditationtime", remainSecond);
                ivStart.setVisibility(View.VISIBLE);
                ivPause.setVisibility(View.GONE);
                ivSitbackto.setVisibility(View.GONE);
                break;
            //回向
            case R.id.iv_sitbackto:

                break;
            case R.id.tv_clear:
                mCountDownTimer.cancel();
                ph.setValue("sitmeditationtime", 0);
                tvTime.setText("00:00:00");
                tvClear.setVisibility(View.INVISIBLE);
                ivStart.setVisibility(View.VISIBLE);
                ivPause.setVisibility(View.GONE);
                ivSitbackto.setVisibility(View.GONE);
                break;
            case R.id.tv_situation:
                goActivity(ChooseSituationActivity.class);
                break;
            case R.id.tv_clock:
                SetTimeDialog dialog = new SetTimeDialog(SitMeditationActivity.this) {
                    @Override
                    protected void sureClick(int time) {
                        ph.setValue("sitmeditationtime", time * 60);//存储时间
                        if (mCountDownTimer != null) {
                            mCountDownTimer.cancel();//取消之前的定时器再去开启新的
                        }
                        initCountDownTimer(time * 60);
                        tvTime.setText(formatLongToTimeStr(time * 60));
                        tvClear.setVisibility(View.VISIBLE);
                        dismiss();
                    }
                };
                dialog.show();
                break;
            //返回
            case R.id.headtopimage2:

                break;
        }
    }

    @OnCheckedChanged({R.id.chk_music})
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        switch (buttonView.getId()) {
            case R.id.chk_music:
                if (isChecked) {

                } else {

                }
                break;
        }
    }


    @Override
    protected int getLayoutId() {
        return R.layout.activity_sitmeditation;
    }


}

5、后续会写个控件进行封装,不仅仅时分秒,而且可以天时分秒,类似限时抢购的样子。。。have a nice day~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值