最近需要一个倒数计时器,要求实现倒数计时,暂停,继续,和快进快退的功能。Android本身提供了一个CountdownTimer的类,采用Handler的方式实现,但是只提供了倒数计时的功能,对于暂停,继续,快进快退功能未提供支持,于是在CounterDownTimer的基础上重写了一个类,最终满足要求。
android自带的CountdownTimer源码:
这个是CountDownTimer的实际运用例子:
http://gundumw100.iteye.com/admin/blogs/1057989
- import
android.os.Handler; - import
android.os.Message; -
- public
abstract class AdvancedCountdownTimer { -
-
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 seek(int value) { -
synchronized (AdvancedCountdownTimer.this) { -
mRemainTime = ((100 - value) * mTotalTime) / 100; -
} -
} -
-
-
public final void cancel() { -
mHandler.removeMessages(MSG_RUN); -
mHandler.removeMessages(MSG_PAUSE); -
} -
-
public final void resume() { -
mHandler.removeMessages(MSG_PAUSE); -
mHandler.sendMessageAtFrontOfQueu e(mHandler.obtainMessage(MSG_RUN)); -
} -
-
public final void pause() { -
mHandler.removeMessages(MSG_RUN); -
mHandler.sendMessageAtFrontOfQueu e(mHandler.obtainMessage(MSG_PAUSE)); -
} -
-
-
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(); -
-
private static final int MSG_RUN = 1; -
private static final int MSG_PAUSE = 2; -
-
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); -
} -
} else if (msg.what == MSG_PAUSE) { -
-
} -
} -
} -
}; - }
android自带的CountdownTimer源码:
-
-
- package
android.os; -
- import
android.util.Log; -
-
- public
abstract class CountDownTimer { -
-
-
private final long mMillisInFuture; -
-
-
private final long mCountdownInterval; -
-
private long mStopTimeInFuture; -
-
-
public CountDownTimer(long millisInFuture, long countDownInterval) { -
mMillisInFuture = millisInFuture; -
mCountdownInterval = countDownInterval; -
} -
-
-
public final void cancel() { -
mHandler.removeMessages(MSG); -
} -
-
-
public synchronized final CountDownTimer start() { -
if (mMillisInFuture <= 0) { -
onFinish(); -
return this; -
} -
mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture; -
mHandler.sendMessage(mHandler.obtainMessage(MSG)); -
return this; -
} -
-
-
-
public abstract void onTick(long millisUntilFinished); -
-
-
public abstract void onFinish(); -
-
-
private static final int MSG = 1; -
-
-
// handles counting down -
private Handler mHandler = new Handler() { -
-
@Override -
public void handleMessage(Message msg) { -
-
synchronized (CountDownTimer.this) { -
final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime(); -
-
if (millisLeft <= 0) { -
onFinish(); -
} else if (millisLeft < mCountdownInterval) { -
// no tick, just delay until done -
sendMessageDelayed(obtainMessage(MSG), millisLeft); -
} else { -
long lastTickStart = SystemClock.elapsedRealtime(); -
onTick(millisLeft); -
-
// take into account user's onTick taking time to execute -
long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime(); -
-
// special case: user's onTick took more than interval to -
// complete, skip to next interval -
while (delay < 0) delay += mCountdownInterval; -
-
sendMessageDelayed(obtainMessage(MSG), delay); -
} -
} -
} -
}; - }
这个是CountDownTimer的实际运用例子:
http://gundumw100.iteye.com/admin/blogs/1057989