今天需要实现的是一个时分秒的倒计时功能。本来之前写过类似限时抢购的功能,想直接引用过来,发现还是不好复用,需要再加深理解下。使用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~