Chronometer では、どのようにして経過時間を抽出し、それを変数に個別に格納することができますか。
たとえば、経過した時間、分、秒の数を別々の int 変数に格納しますか?
出来ますか?はいの場合、どのように?
クロノメーターとは別に、他のコンセプトを使ってもっとうまくやれるでしょうか? はいの場合、それは何ですか?
Chronometer では、どのようにして経過時間を抽出し、それを変数に個別に格納することができますか。
たとえば、経過した時間、分、秒の数を別々の int 変数に格納しますか?
出来ますか?はいの場合、どのように?
クロノメーターとは別に、他のコンセプトを使ってもっとうまくやれるでしょうか? はいの場合、それは何ですか?
それを行うことで、時間値 (ミリ秒単位) を取得できます。
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
独自のクロノメーターを作成することもできます。これは私がカウントダウン タイマーとして使用する例ですが、考え方は逆でも同じです。 @Override onTick を使用して iSec を 60 から現在の値を引いた値として保存し、「void setTimeText()」を値を表示する方法に変更します。デフォルトで 0 から始まるように setTrainingCountdown() も変更する必要があります。
それを使用するには、新しい SkillQCountdown を作成するときに任意の TextView をバインドし、setTrainingCountdown() で開始します。タイマーを一時停止して再起動する方法を作成することができます (タイマーを停止して値を保存し、保存された値で再起動するだけです)。 . ミリ秒も保存して表示する場合は、この行を「counter = new CountQueue(60000, 100);」に変更します。そのため、60 秒ごとではなく 1 秒ごとに onTick を登録できます。2 番目の値は、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();
}
}
}
}