Android 计时器,仿Chronometer

首先,这里是Chronometer的一个例子,转载于http://blog.csdn.net/sun6255028/article/details/6688349

因为刚在项目中,使用了Chronometer,但是也许是自己用的不好,所以仿照Chronometer的思路,自己写了一个.但是没有封装成工具类,等以后完善吧....

但是先跟提供一个Chronometer使用的例子,解释的比较详细.

Chronometr是一个简单的定时器,你可以给它一个开始时间,并以此定时,或者如果你不给它一个开始时间,

它将会使用你的时间通话开始。默认情况下它会显示在当前定时器的值得形式"分:秒" 或"MM:SS",

 或者可以使用set(字符串)的定时器值到一个任意字符串


重要属性

[html]  view plain copy
  1. android:format    定义时间的格式如: hh:mm:ss  


重要方法
[html]  view plain copy
  1. setBase(long base)      //设置倒计时定时器  
  2. setFormat(String format)    //设置显示时间的格式   
  3. start()             //开始计时  
  4. stop()              //停止计时  
  5.                                 //当计时器改变时调用  
  6. setOnChronometerTickListener(Chronometer.OnChronometerTickListener listener)  


效果图



例程main.xml源码

[html]  view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  2.     android:orientation="vertical"  
  3.     android:layout_width="wrap_content"   
  4.     android:layout_height="wrap_content">  
  5.   
  6. <Chronometer  
  7.     android:id="@+id/chronometer"   
  8.     android:layout_width="wrap_content"  
  9.     android:layout_height="wrap_content"/>  
  10.   
  11.     <LinearLayout   
  12.         android:layout_width="wrap_content"   
  13.         android:layout_height="wrap_content">  
  14.       
  15.         <Button   
  16.             android:onClick="onStart"   
  17.             android:text="开始计时"   
  18.             android:layout_width="wrap_content"   
  19.             android:layout_height="wrap_content"/>  
  20.           
  21.         <Button   
  22.             android:onClick="onStop"   
  23.             android:text="停止计时"   
  24.             android:layout_width="wrap_content"   
  25.             android:layout_height="wrap_content"/>  
  26.           
  27.         <Button   
  28.             android:onClick="onReset"   
  29.             android:text="重置"   
  30.             android:layout_width="wrap_content"   
  31.             android:layout_height="wrap_content"/>     
  32.     </LinearLayout>  
  33. </LinearLayout>  

Java源码

[html]  view plain copy
  1. ackage com.sx.Chronometer;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.SystemClock;  
  6. import android.view.View;  
  7. import android.widget.Chronometer;  
  8.   
  9. public class ChronometerActivity extends Activity   
  10. {  
  11.     private Chronometer chronometer = null;  
  12.       
  13.     /** Called when the activity is first created. */  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState)  
  16.     {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.           
  20.         chronometer = (Chronometer) findViewById(R.id.chronometer);  
  21.         chronometer.setFormat("计时:%s");  
  22.     }  
  23.       
  24.     public void onStart(View view)   
  25.     {  
  26.          chronometer.start();  
  27.     }  
  28.       
  29.     public void onStop(View view)   
  30.     {  
  31.          chronometer.stop();  
  32.     }  
  33.       
  34.     public void onReset(View view)  
  35.     {  
  36.          chronometer.setBase(SystemClock.elapsedRealtime());  
  37.     }  
  38. }  
---------------------------

不知道大家使用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>
好了,实现完成了,呵呵......

大家如果发现什么问题,帮我在下面提出来,我来修改,呵呵....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值