在 Chronometer 中,我们如何提取经过的时间并将其单独存储在变量中。
例如,将经过的小时数、分钟数、秒数存储在单独的 int 变量中?
是否可以?如果是,如何?
除了 Chronometer 之外,使用其他概念可以更好地完成吗?如果是,那是什么?
在 Chronometer 中,我们如何提取经过的时间并将其单独存储在变量中。
例如,将经过的小时数、分钟数、秒数存储在单独的 int 变量中?
是否可以?如果是,如何?
除了 Chronometer 之外,使用其他概念可以更好地完成吗?如果是,那是什么?
您可以获得时间值(以毫秒为单位):
long timeElapsed = SystemClock.elapsedRealtime() - chrono.getBase();
然后您可以简单地检索小时、分钟和秒,如下所示:
long timeElapsed = 7564000; //For example
int hours = (int) (timeElapsed / 3600000);
int minutes = (int) (timeElapsed - hours * 3600000) / 60000;
int seconds = (int) (timeElapsed - hours * 3600000 - minutes * 60000) / 1000;
//hours = 2
//minutes = 6
//seconds = 4
我突然想到了几个想法:
getText()
并解析每个时间":"
(或任何本地时间分隔符)。您还可以自己计算当前时间(以毫秒为单位),将其传递给 Java Calendar 对象并使用它的get()
方法:
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendar.setTimeInMillis(SystemClock.elapsedRealtime() - chronometer.getBase());
int hour = calendar.get(Calendar.HOUR_OF_DAY);
// etc
您也可以创建自己的 Chronometer,这是一个我用作倒数计时器的示例,但想法是相反的,您只需要更改 CountQueue CountDownTimer 以添加分钟和小时而不是减去它们,更改@Override onTick 将 iSec 存储为 60 减去当前值并将“void setTimeText()”更改为您想要显示的值。setTrainingCountdown() 也应该改变,所以它默认从 0 开始。
要使用它,您只需在创建新 SkillQCountdown 时绑定任何 TextView 并使用 setTrainingCountdown() 启动它,您可能想要创建一种暂停和重新启动计时器的方法(只需停止计时器并存储值,然后使用存储的值重新启动) . 如果您还想存储和显示毫秒,请更改此行“counter = new CountQueue(60000, 100);” 因此您可以每秒注册一次 onTick 而不是每 60 秒一次,第二个值是它尝试使用新值更新 TextView 的频率。
但是,如果您只想精确存储值,则可以在计数开始时以毫秒为单位获取当前时间,并且无论何时要获取值,然后减去该值并计算秒、分钟和小时,就像您可以看到它是在“public void setTrainingCountdown(long diffInMis)”中完成的
public class SkillQCountdown {
int iDay,iHour,iMin,iSec;
CountQueue counter;
NumberFormat myFormat = NumberFormat.getInstance();
Context mContext;
private TextView text = null;
public SkillQCountdown(Context context, TextView text){
mContext = context;
this.text = text;
}
public void setTrainingCountdown(long diffInMis) {
myFormat.setMinimumIntegerDigits(2);
try {
if(diffInMis < 0) {
Toast.makeText(mContext, "Skill Queue unsynchronized"
,Toast.LENGTH_SHORT).show();
}else {
long diff = TimeUnit.MILLISECONDS.toSeconds(diffInMis);
iDay = (int) (diff/(60*60*24));
long lday = (diff%(60*60*24));
iHour = (int)(lday/3600);
long lhour = (lday%(60*60));
iMin = (int)(lhour/60);
long lmin= (lhour%(60));
iSec = (int)(lmin);
setTimeText();
counter = new CountQueue(iSec*1000, 100);
counter.start();}
} catch (ParseException e) {
e.printStackTrace();
}
}
private void setTimeText() {
StringBuilder sb = new StringBuilder();
String strText = null;
if (iDay > 0) {
sb.append(myFormat.format(iDay));
if (iDay == 1) {
sb.append(" day ");
}else {
sb.append(" days ");
}
}
if (iHour > 0 || iDay > 0) {
sb.append(myFormat.format(iHour));
if (iHour == 1) {
sb.append(" hour ");
}else {
sb.append(" hours ");
}
}
if (iMin > 0 || iHour > 0 || iDay > 0) {
sb.append(myFormat.format(iMin));
if (iMin == 1) {
sb.append(" minute ");
}else {
sb.append(" minutes ");
}
}
if (iSec > 0 || iMin > 0 || iHour > 0 || iDay > 0) {
sb.append(myFormat.format(iSec));
sb.append(" seconds");
strText = sb.substring(0);
}else {
strText = mContext.getString(R.string.msg_skillQueueEmpty);
}
text.setText(strText);
}
private class CountQueue extends CountDownTimer{
public CountQueue(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
iSec = 0;
setTimeText();
counter = new CountQueue(60000, 100);
counter.start();
iMin-=1;
if(iMin < 0 && (iHour > 0 || iDay > 0)) {
iMin=59;
iHour-=1;
if(iHour < 0 && iDay > 0) {
iHour=23;
iDay-=1;
}
}
}
@Override
public void onTick(long millisUntilFinished) {
if (Math.floor((float)millisUntilFinished / 1000.0f) != iSec) {
iSec = (int) Math.floor((float)millisUntilFinished / 1000.0f);
setTimeText();
}
}
}
}