关于安卓如何实现计时器chronometer的暂停和继续计时功能

来源:互联网 发布:端口有感叹号 编辑:程序博客网 时间:2024/05/19 20:38

安卓的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>





1 0
原创粉丝点击