安卓的Chronometer组件的基本函数有setBase,设置基础计时点。暂停和继续计时关键是通过设置基础计时点来实现的。当用户点击暂停的时候获取Chronometer从开始到当前暂停所用的时间,即rangeTime=SystemClock.elapsedRealtime()-chronometer.getBase();当用户点继续计时的时候,重新setBase,获取当前点击的时间减去rangeTime即为要设置的Base时间,即chronometer.setBase(SystemClock.elapsedRealtime()-rangeTime);
对于Chronometer.setBase(long)方法,个人的理解是时间基点,比如
chronomer.setBase(SystemClock.elapsedRealtime()-rangeTime-2000);
此时就相当与从00:02开始重新计时,所以上面的rangeTime也可以理解为Chronometer的计时运行的时间,继续计时时就从上次的计时时间接着计时。
这是自己在熟悉Chronometer控件时,通过了解,想到如何实现暂停和继续计时的功能,网上也查过别人的论文,自己是个新手,有说不好或者说错的地方,请大家指导下。除了暂停和继续计时功能外,其余很大一部分是参考这篇文章的:http://mobile.51cto.com/aprogram-395278.htm
(参考:Android开发:Chronometer控件实现计时器2013-05-23 16:01 佚名 jizhuomi )
package com.book.b525;
import java.text.ChoiceFormat;
import android.app.Activity;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.EditText;
import android.widget.Toast;
import android.os.Build;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer1);
Button btnStart = (Button) findViewById(R.id.btnStart);
Button btnStop = (Button) findViewById(R.id.btnStop);
Button btnRest = (Button) findViewById(R.id.btnReset);
final Button btnPC=(Button) findViewById(R.id.btnPC);
final EditText edtSetTime = (EditText) findViewById(R.id.setTimeEdit);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("--开始记时---");
rangeTime=0;
String ss = edtSetTime.getText().toString();
if (!(ss.equals("") && ss != null)) {
startTime = Integer.parseInt(edtSetTime.getText()
.toString());
}
// 设置开始讲时时间
chronometer.setBase(SystemClock.elapsedRealtime());
// 开始记时
chronometer.start();
}
});
//暂停或继续计时
btnPC.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
if(!PAUSE)//暂停计时
{
btnPC.setText("继续");
//从开始计时计时器运行的时间差。。。。。关键
MainActivity.this.rangeTime=SystemClock.elapsedRealtime()-chronometer.getBase();
//Toast.makeText(MainActivity.this, "时间:"+rangeTime, Toast.LENGTH_SHORT).show();
chronometer.stop();
}
else //继续计时
{
btnPC.setText("暂停");
//设置计时器的基时间。。。。。关键
chronometer.setBase(SystemClock.elapsedRealtime()-rangeTime);
chronometer.start();
}
PAUSE=!PAUSE;
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 停止
chronometer.stop();
}
});
// 重置
btnRest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.setBase(SystemClock.elapsedRealtime());
}
});
chronometer
.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
// 如果开始计时到现在超过了startime秒
if (SystemClock.elapsedRealtime()
- chronometer.getBase() > startTime * 1000) {
chronometer.stop();
// 给用户提示
showDialog();
}
}
});
}
protected void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.picture);
builder.setTitle("警告").setMessage("时间到")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
private int startTime = 0;
private boolean PAUSE=false;
private long rangeTime;//
}
布局文件中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/mybackground"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dip"
android:orientation="horizontal" >
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="center"
android:text="@string/setTimeText" />
<EditText
android:id="@+id/setTimeEdit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="number" >
<requestFocus />
</EditText>
</LinearLayout>
<Chronometer
android:id="@+id/chronometer1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#ff0000"
android:textSize="60sp" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/btnStart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开始" />
<Button
android:id="@+id/btnPC"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="暂停" />
<Button
android:id="@+id/btnStop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止" />
<Button
android:id="@+id/btnReset"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="重置" />
</LinearLayout>
</LinearLayout>