就是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>
結果:
沒有留言:
張貼留言