آموزش جاوا و اندروید

یادداشت های یک برنامه نویس معمولی

آموزش جاوا و اندروید

یادداشت های یک برنامه نویس معمولی

طبقه بندی موضوعی

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++;
        }

    }
});

 

مثال

فیلم آموزشی

 

موافقین ۰ مخالفین ۰ ۹۹/۰۸/۲۸
میم دال

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی