关于安卓如何实现计时器chronometer的暂停和继续计时功能
2014-06-08 13:36
507 查看
安卓的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>
对于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>
相关文章推荐
- Android关于Chronometer计时器的暂停继续计时
- chronometer计时器实现暂停功能与初始值为0的功能
- [安卓初学者实验]使用计时器(Chronometer)实现可暂停的计时器
- 做一个计时器示例 在页面上有一个文本框和一个普通按钮 在状态栏上显示,单击按钮,开始计时的提示信息 单击按钮时,在文本框显示计数的过程,同时要求按钮上的字,显示为“单击暂停” 此时单击按钮,暂停计时,同时按钮上的字显示为“继续计时”,要求这两种状态来回切换,来完成计数器的功能
- 关于如何实现表间查询并提取班号的再研究(字典功能)
- c#如何实现一个线程暂停,等待用户输入文本后继续运行?
- JS实现程序暂停与继续功能代码解读
- 关于Chronometer(计时器)暂停的问题
- 关于在安卓开发中百度地图功能不能实现定位。
- 关于如何实现美团网的导航功能并且能重用ListView的Item(下载免费了)
- 关于android程序自动更新功能的实现,如何去除安装提示
- C# 如何实现一个线程暂停和继续 - 转
- 实现文件异步读写、暂停、继续、停止功能的类
- 手把手教你如何在安卓平台上实现打电话发短信的功能
- 安卓中实现计时器的功能
- 解决关于如何实现锁屏后继续播放音乐的问题
- 关于如何利用Keil C实现51单片机中断功能(interrupt、using关键字的用法)
- C# 如何实现一个线程暂停和继续
- 关于Chronometer(计时器)暂停的问题
- 关于如何实现表间查询并提取班号的再研究(字典功能)