首先,这里是Chronometer的一个例子,转载于http://blog.csdn.net/sun6255028/article/details/6688349
因为刚在项目中,使用了Chronometer,但是也许是自己用的不好,所以仿照Chronometer的思路,自己写了一个.但是没有封装成工具类,等以后完善吧....
但是先跟提供一个Chronometer使用的例子,解释的比较详细.
Chronometr是一个简单的定时器,你可以给它一个开始时间,并以此定时,或者如果你不给它一个开始时间,
它将会使用你的时间通话开始。默认情况下它会显示在当前定时器的值得形式"分:秒" 或"MM:SS",
或者可以使用set(字符串)的定时器值到一个任意字符串
重要属性
- android:format 定义时间的格式如: hh:mm:ss
- setBase(long base) //设置倒计时定时器
- setFormat(String format) //设置显示时间的格式
- start() //开始计时
- stop() //停止计时
- //当计时器改变时调用
- setOnChronometerTickListener(Chronometer.OnChronometerTickListener listener)
例程main.xml源码
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <Chronometer
- android:id="@+id/chronometer"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <Button
- android:onClick="onStart"
- android:text="开始计时"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <Button
- android:onClick="onStop"
- android:text="停止计时"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <Button
- android:onClick="onReset"
- android:text="重置"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </LinearLayout>
- </LinearLayout>
Java源码
- ackage com.sx.Chronometer;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.SystemClock;
- import android.view.View;
- import android.widget.Chronometer;
- public class ChronometerActivity extends Activity
- {
- private Chronometer chronometer = null;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- chronometer = (Chronometer) findViewById(R.id.chronometer);
- chronometer.setFormat("计时:%s");
- }
- public void onStart(View view)
- {
- chronometer.start();
- }
- public void onStop(View view)
- {
- chronometer.stop();
- }
- public void onReset(View view)
- {
- chronometer.setBase(SystemClock.elapsedRealtime());
- }
- }
不知道大家使用Chronometer时,用没有遇到这样的情况.
当我将Chronometer停止,之后,发现它在后面其实还在跑,比如它走到"00:10",我将它停止,它显示的是"00:10",没有问题,但是重新点击开始之后,会发现,它显示的不是从"00:10"开始递增,而是,自己在后面默默地增加,显示出来的也许是"00:15"或者其他数字了,这样就完全不符合的我要求了
我将它重置之后,过一段时间,点击开始,发现它也不是从"00:00"开始,而是从你点击递增之后,重新开始在即默默地在后面从1开始递增,你过去了多少秒,它显示的就是多少秒,我完全无语了,
于是,完了解决项目中的这个问题,自己动手,仿照Chronometer的一部分思想,自己写了一个计时器,但是已经加班到半夜,所以懒得封装成自定义View了,,,
下面的就是实现的代码,供大家参考,学习:
1.MainActivity:
package com.example.chronometerdemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
/** handler的what */
private static final int CHRONOMETER_WHAT = 0x010001;
/** 显示计时组件 */
private TextView tv_duration;
/** 保存开始或者继续计时,停止计时状态;true为开始或继续计时;false为停止计时 */
private boolean mRunning = false;
/** 保存上一次的操作,用于判断 */
private Boolean lastRunning = false;
/** 初始计时的开始点以及显示的时间 */
private String displayTime = "00:00";
/** 计时的数,用于递增 */
private int increasingNumber = 0;
/** 计时的默认值,这里用做默认显示,以及计时的终点 */
private String defaultChronometer = "00:30";
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case CHRONOMETER_WHAT:
tv_duration.setText(changeTime(++increasingNumber));
if (mRunning) {
mHandler.sendMessageDelayed(
Message.obtain(mHandler, CHRONOMETER_WHAT), 1000);
}
break;
default:
break;
}
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_duration = (TextView) findViewById(R.id.text);
// chronometer = (Chronometer) findViewById(R.id.chronometer);
// chronometer.setText("00:30");
}
/**
* 时间的显示的方法
*
*/
private String changeTime(int duration) {
//进行判断,这里最多显示为60秒
if (0 < duration && duration < 10) {
displayTime = "00:0" + String.valueOf(duration);
} else if (duration >= 10 && duration < 60) {
displayTime = "00:" + String.valueOf(duration);
} else {
displayTime = "00:60";
}
return displayTime;
}
/**
* 开始或继续计时
*
* @param view
*/
public void onStart(View view) {
//将状态修改为计时状态
mRunning = true;
//执行计时操作
updateRunning();
// chronometer.start();
}
/**
* 停止计时
*
* @param view
*/
public void onStop(View view) {
//停止计时
onStopChronometer();
// chronometer.stop();
}
/**
* 停止计时
*/
private void onStopChronometer() {
//将状条改为停止计时状态
mRunning = false;
//执行操作
updateRunning();
}
/**
* 重置并停止计时
*
* @param view
*/
public void onReset(View view) {
//停止计时
onStopChronometer();
//显示默认时间
tv_duration.setText(defaultChronometer);
displayTime = "00:00";
increasingNumber = 0;
// chronometer.setBase(SystemClock.elapsedRealtime());
// chronometer.setText("00:30");
}
/**
* 递增的增加时间
*/
private void updateRunning() {
//判断,防止重复点击,因为点击多次后,sendMessageDelayed会被发送多次
if (mRunning == lastRunning) {
return;
}
//获取上次操作状态
boolean running = lastRunning;
//判断, 当两次操作不一样时
if (running != mRunning) {
//判断,mRnning为true时,启动定时;false时,停止定时
if (mRunning) {
//发送消息
mHandler.sendMessageDelayed(
Message.obtain(mHandler, CHRONOMETER_WHAT), 1000);
} else {
//移除任何即将发布的消息代码“what”的在消息队列。
mHandler.removeMessages(CHRONOMETER_WHAT);
}
//保存状态
lastRunning = mRunning;
}
}
}
2.activity_main.xml布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:onClick="onStart"
android:text="开始计时"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:onClick="onStop"
android:text="停止计时"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:onClick="onReset"
android:text="重置"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
好了,实现完成了,呵呵......
大家如果发现什么问题,帮我在下面提出来,我来修改,呵呵....