chronometer
این کرنومتر یه مقدار عجیبه! این ویو اکستند شده از تکست ویو بوده و یک تایمر ساده رو پیاده سازی میکنه.
علاوه بر این، دیتای خاصی توی خودش نگه نمیداره.
این کرنومتر دارای متدهای start و stop هست و pause نداره. ولی میشه خودمون pause رو پیاده سازی کنیم.
به صورت پیش فرض، یعنی اگر بنویسیم
chronometer.start();
از صفر شروع به شمارش نمیکنه! از زمانی که اکتیویتی استارت میشه شروع به شمارش میکنه. یعنی اولین بار ممکنه از 3 یا 4 (هر چقدر از شروع استارت شدن اکتیویتی گذشته باشه) بشمره.
قبل از استارت شدن با تعیین کردن Base میشه گفت از چه عددی شروع به شمارش کند. کد زیر سبب میشه تا از صفر بشمره:
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();
برای اینکه از ده ثانیه شروع به شمارش کنه:
chronometer.setBase(SystemClock.elapsedRealtime() - 10*1000);
chronometer.start();
(انگار واسه خودش یه SystemClock.elapsedRealtime داخلی داره و آرگومان setBase رو ازش تفریق میکنه! برداشت منه البته!)
این کرنومتر استپ نمیشه! یعنی ما حتا اگر متد stop رو فراخونی کنیم، ظاهرا متوقف میشه ولی توی بک گراند داره میشمره! بنابراین پیاده سازی pause باید بعد از فراخوانی متد stop مقدار زمانی رو که تا الآن شمره توی یک متغیر سیو کنیم و قبل از استارت شدن بهش بگیم که از این مقدار شروع به شمارش کنه.
(متد getBase میگه کرنومتر از چه شماره ای شروع به شمارش کرده)
public void start(View view) {
if (!running) {
chronometer.setBase(SystemClock.elapsedRealtime() - pauseOffset);
chronometer.start();
running = true;
}
}
public void pause(View view) {
if (running) {
chronometer.stop();
//به نحوه دریافت آفست دقت شود
pauseOffset = SystemClock.elapsedRealtime() - chronometer.getBase();
running = false;
}
}
در این برنامه یه متد reset هم نوشتم که مقدار کرنومتر رو صفر میکنه (دستور اول در متد زیر)
public void reset(View view) {
chronometer.setBase(SystemClock.elapsedRealtime());
pauseOffset = 0;
}
این کرنومتر یک لیسنر داره که هر بار که مقدارش عوض میشه فراخونی میشه. توی کد زیر من هر ده تا توست کنه ولی زیاد دقیق نیست (یعنی لزوما ده ثانیه طول نمیکشه)
chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
if (count >= 10) {
Toast.makeText(MainActivity.this, "10 seconds!", Toast.LENGTH_SHORT).show();
count = 0;
} else {
count++;
}
}
});