2013年5月19日 星期日

[Android] 計時器(Chronometer)

1.在使用計時器時,有一個地方需要注意,
就是setBase,這個方法是用來設定一個基準點,也就是我從這個基準點開始計時。

假設我們的程式是這樣寫,就會發生問題,
當我們呼叫start()後,等到過了25秒,按下停止,
再過了15秒後,我們再按下開始讓它繼續計時,
就會發現不是從25秒往下算,而是從40秒開始算。
這是因為計時器從第一次按下開始的時間做為基準點,所以是40秒(25+15)
  btnStart.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    chronometer.start();
   }
  });

  btnStop.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    chronometer.stop();
   }
  });


2.為了解決上述的問題,我們需要額外利用一個參數(escapeTime)及setBase方法
在按下停止時先記錄已經跑過的時間,
然後待下一次按開始繼續計時的時候,在加上去
MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Chronometer;

public class MainActivity extends Activity {
 long escapeTime = 0;

 /* Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  final Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer1);
  final Button btnStart = (Button) findViewById(R.id.button1);
  final Button btnStop = (Button) findViewById(R.id.button2);
  final Button btnReset = (Button) findViewById(R.id.button3);

  btnStart.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {

    // SystemClock.elapsedRealtime()方法會回傳從開機到現在的時間
    // 把這個時間做為一個Base,從這個Base開始計時
    chronometer.setBase(SystemClock.elapsedRealtime() + escapeTime);
    chronometer.start();
   }
  });

  btnStop.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    //getBase是用來取得上一次setBase()的時間"chronometer.setBase(SystemClock.elapsedRealtime() + escapeTime);"
    escapeTime = chronometer.getBase() - SystemClock.elapsedRealtime();
    chronometer.stop();
   }
  });

  btnReset.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    chronometer.setBase(SystemClock.elapsedRealtime());
    chronometer.stop();
    escapeTime = 0;
   }
  });

 }

}


3.layout即拉入一個計時器,三個按鈕。
res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Chronometer
        android:id="@+id/chronometer1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="14dp"
        android:text="Chronometer" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="開始(start)" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="停止(stop)" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="18dp"
        android:text="重置(reset)" />

</LinearLayout>
結果:

沒有留言:

張貼留言