【转】Android - 带暂停,继续,重置功能的简易倒计时器-附jpg源码

来源:http://www.javaask.com/mobile/android/2011/0406/5961.html

摘要:这个倒计时器,可以有暂停,继续,重置的功能,并能自动更新剩余时间。

            源码是个人根据网上的方法,做的。

             老样子,工程文件打成包传上来的,请右击保存成CountDownTimer.zip ,解压缩后即可用Eclipse导入工程。

保存成CountDownTimer.zip


------------------------------------------------------------------------------------------------------------------------------

下面附上网页的拷贝

这是一个android平台的简易倒计时器,可以实现设置时间的倒计时以及时间到后的提醒功能。

android sdk提供的CountdownTimer 类已经实现的倒计时功能,但却没有暂停,继续等功能,在这个类的基础上可以实现一个自己的计时类。

package com.util;

Java代码 
import android.os.Handler; 
import android.os.Message; 
//在android自带的CountdownTimer类基础上实现定时功能 
public abstract class AdvancedCountdownTimer { 
private static final int MSG_RUN = 1; 

private final long mCountdownInterval;// 定时间隔,以毫秒计 
private long mTotalTime;// 定时时间 
private long mRemainTime;// 剩余时间 

// 构造函数 
public AdvancedCountdownTimer(long millisInFuture, long countDownInterval) { 
mTotalTime = millisInFuture; 
mCountdownInterval = countDownInterval; 
mRemainTime = millisInFuture; 


// 取消计时 
public final void cancel() { 
mHandler.removeMessages(MSG_RUN); 


// 重新开始计时 
public final void resume() { 
mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_RUN)); 


// 暂停计时 
public final void pause() { 
mHandler.removeMessages(MSG_RUN); 


// 开始计时 
public synchronized final AdvancedCountdownTimer start() { 
if (mRemainTime <= 0) {// 计时结束后返回 
onFinish(); 
return this; 

// 设置计时间隔 
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RUN), 
mCountdownInterval); 
return this; 


public abstract void onTick(long millisUntilFinished, int percent);// 计时中 

public abstract void onFinish();// 计时结束 

// 通过handler更新android UI,显示定时时间 
private Handler mHandler = new Handler() { 

@Override 
public void handleMessage(Message msg) { 

synchronized (AdvancedCountdownTimer.this) { 
if (msg.what == MSG_RUN) { 
mRemainTime = mRemainTime - mCountdownInterval; 

if (mRemainTime <= 0) { 
onFinish(); 
} else if (mRemainTime < mCountdownInterval) { 
sendMessageDelayed(obtainMessage(MSG_RUN), mRemainTime); 
} else { 

onTick(mRemainTime, new Long(100 
* (mTotalTime - mRemainTime) / mTotalTime) 
.intValue()); 

sendMessageDelayed(obtainMessage(MSG_RUN), 
mCountdownInterval); 




}; 
}

import android.os.Handler;
import android.os.Message;
//在android自带的CountdownTimer类基础上实现定时功能
public abstract class AdvancedCountdownTimer {
private static final int MSG_RUN = 1;

private final long mCountdownInterval;// 定时间隔,以毫秒计
private long mTotalTime;// 定时时间
private long mRemainTime;// 剩余时间

// 构造函数
public AdvancedCountdownTimer(long millisInFuture, long countDownInterval) {
mTotalTime = millisInFuture;
mCountdownInterval = countDownInterval;
mRemainTime = millisInFuture;
}

// 取消计时
public final void cancel() {
mHandler.removeMessages(MSG_RUN);
}

// 重新开始计时
public final void resume() {
mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_RUN));
}

// 暂停计时
public final void pause() {
mHandler.removeMessages(MSG_RUN);
}

// 开始计时
public synchronized final AdvancedCountdownTimer start() {
if (mRemainTime <= 0) {// 计时结束后返回
onFinish();
return this;
}
// 设置计时间隔
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RUN),
mCountdownInterval);
return this;
}

public abstract void onTick(long millisUntilFinished, int percent);// 计时中

public abstract void onFinish();// 计时结束

// 通过handler更新android UI,显示定时时间
private Handler mHandler = new Handler() {

@Override
public void handleMessage(Message msg) {

synchronized (AdvancedCountdownTimer.this) {
if (msg.what == MSG_RUN) {
mRemainTime = mRemainTime - mCountdownInterval;

if (mRemainTime <= 0) {
onFinish();
} else if (mRemainTime < mCountdownInterval) {
sendMessageDelayed(obtainMessage(MSG_RUN), mRemainTime);
} else {

onTick(mRemainTime, new Long(100
* (mTotalTime - mRemainTime) / mTotalTime)
.intValue());

sendMessageDelayed(obtainMessage(MSG_RUN),
mCountdownInterval);
}

}
}
};
}
这是一个抽象工具类,在主程序中编写一个类继承它就可以实现相应的计时功能。

 

Java代码 
package com.timer; 

import java.io.IOException; 
import com.util.AdvancedCountdownTimer; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Button; 
import android.widget.Toast; 

public class Timer extends Activity implements OnClickListener { 

private TextView txt_time = null;//显示剩余时间 
private EditText edt_hour = null;//定时时间编辑框 
private EditText edt_minute = null; 
private EditText edt_second = null; 
private Button btn_start = null;//各个按钮 
private Button btn_pause = null; 
private Button btn_con = null; 
private Button btn_reset = null; 
private Button btn_exit = null; 

private long hour = 0;//时间变量 
private long minute = 0; 
private long second = 0; 
private long time = 0; 

private MyCount count = null;//定时类对象 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
findViews(); 
setListener(); 

//识别各个控件并设置按钮状态 
private void findViews() { 
txt_time = (TextView) findViewById(R.id.text); 
edt_hour = (EditText) findViewById(R.id.hour); 
edt_minute = (EditText) findViewById(R.id.minute); 
edt_second = (EditText) findViewById(R.id.second); 
btn_start = (Button) findViewById(R.id.start); 
btn_pause = (Button) findViewById(R.id.pause); 
btn_con = (Button) findViewById(R.id.con); 
btn_reset = (Button) findViewById(R.id.reset); 
btn_exit = (Button) findViewById(R.id.exit); 
btn_pause.setEnabled(false); 
btn_con.setEnabled(false); 


//绑定监听器 
private void setListener() { 
btn_start.setOnClickListener(this); 
btn_pause.setOnClickListener(this); 
btn_con.setOnClickListener(this); 
btn_reset.setOnClickListener(this); 
btn_exit.setOnClickListener(this); 


//获取设置的时间并判断输入是否为空 
private boolean setTime() { 
String strHour = edt_hour.getText().toString();//取控件的值 
String strMinute = edt_minute.getText().toString(); 
String strSecond = edt_second.getText().toString(); 
if (strHour.equals("") || strMinute.equals("") || strSecond.equals("")) { 
return false; 
} else { 
hour = Long.parseLong(strHour); 
minute = Long.parseLong(strMinute); 
second = Long.parseLong(strSecond); 
time = (hour * 3600 + minute * 60 + second) * 1000; 
count = new MyCount(time, 1000); 
return true; 



//设置监听器 
@Override 
public void onClick(View v) { 
switch (v.getId()) { 
//点击开始计时按钮 
case R.id.start: 
if (setTime() == false) { 
Toast.makeText(Timer.this, "请输入完整定时时间", Toast.LENGTH_LONG) 
.show(); 
} else { 
count.start();//开始计时 
btn_start.setEnabled(false); 
btn_pause.setEnabled(true); 

break; 
//点击暂停按钮 
case R.id.pause: 
count.pause();//暂停 
btn_pause.setEnabled(false); 
btn_con.setEnabled(true); 
break; 
//点击继续按钮 
case R.id.con: 
count.resume();//继续 
btn_pause.setEnabled(true); 
btn_con.setEnabled(false); 
break; 
//点击重置按钮 
case R.id.reset: 
count.cancel();//取消及时,重置界面状态 
txt_time.setText(""); 
edt_hour.setText("0"); 
edt_hour.setText("0"); 
edt_second.setText("30"); 
btn_pause.setEnabled(false); 
btn_con.setEnabled(false); 
btn_start.setEnabled(true); 
break; 
//点击退出按钮 
case R.id.exit: 
android.os.Process.killProcess(android.os.Process.myPid());//退出 
break; 
default: 
break; 




//实现计时功能的类 
class MyCount extends AdvancedCountdownTimer { 

public MyCount(long millisInFuture, long countDownInterval) { 
super(millisInFuture, countDownInterval); 


@Override 
public void onFinish() { 
//媒体对象 
final MediaPlayer media = MediaPlayer.create(Timer.this, R.raw.alarm); 
//对话框对象 
final AlertDialog mydialog = new AlertDialog.Builder(Timer.this).setMessage( 
"时间到!").setPositiveButton("确定", new DialogInterface.OnClickListener(){ 

@Override 
public void onClick(DialogInterface dialog, int which) { 
media.stop(); 
media.release(); 
btn_pause.setEnabled(false); 
btn_con.setEnabled(false); 
btn_start.setEnabled(true); 


}).create(); 
mydialog.show();//播放结束后显示对话框 
txt_time.setText(""); 
try { 
media.prepare(); //准备播放音乐 
} catch (IllegalStateException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 

media.start();//播放音乐 
media.setOnCompletionListener(new OnCompletionListener() {//播放结束后会话框消失,重置按钮状态 
@Override 
public void onCompletion(MediaPlayer mp) { 
mydialog.hide(); 
btn_pause.setEnabled(false); 
btn_con.setEnabled(false); 
btn_start.setEnabled(true); 


}); 


//更新剩余时间 
@Override 
public void onTick(long millisUntilFinished, int percent) { 
long myhour = (millisUntilFinished / 1000) / 3600; 
long myminute = ((millisUntilFinished / 1000) - myhour * 3600) / 60; 
long mysecond = millisUntilFinished / 1000 - myhour * 3600 
- myminute * 60; 
txt_time.setText("剩余时间" + myhour + ":" + myminute + ":" + mysecond); 





}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值