Android
提供了一个计时器组件Chronometer
,在原来某些需要倒计时的界面中,完全不需要自己去实现一个。
Chronometer
的用法比较简单,就不浪费时间了。
看看Chronometer
怎么实现定时更新时间(改变UI效果
)的,在以后自定义某些定时执行UI更新的控件时(指的是你的定时Banner
和定时上下滚动的公告条
)可以参考,不会又去用Handler + Runnable
或者 Timer + Task
了。
(题外话1. 当然postDelayed()
底层也是用的Handler
来完成的,但是这个Handler
就不需要我们手动再创建一次了。
题外话2. ,API 19
的时候Chronometer
就是用Handler + Runnable
实现的,API 25
的时候就不是了)
怎么定时改变UI效果
从start()
方法开始查看,调用了updateRunning()
一下。在updateRunning()
一系列判断,满足条件后在updateText()
里setText()
设置文字,接着postDelayed()
一个Runnable
。在Runnable
里同样进行判断 ,更新文本+postDelayed()
....通过这样就形成了定时改变UI效果。
什么时机去启动和停止这个定时器?
private void updateRunning() {
boolean running = mVisible && mStarted;
if (running != mRunning) {
if (running) {
updateText(SystemClock.elapsedRealtime());
dispatchChronometerTick();
postDelayed(mTickRunnable, 1000);
} else {
removeCallbacks(mTickRunnable);
}
mRunning = running;
}
}
上面的是updateRunning()
方法,代码简单易懂,首先判断了是否可见是是否开启,是否开启就不看了。看这个mVisible
是那些情况下会发生改变。
- onDetachedFromWindow
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mVisible = false;
updateRunning();
}
- onWindowVisibilityChanged(int)
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
mVisible = visibility == VISIBLE;
updateRunning();
}
没有比这还清晰明了的代码了。
在View
从Window
上分离
的时候,mVisible = false
,
在Window
可见度发生改变的时候mVisible = visibility == VISIBLE;
系统提供的还有一个onAttachedToWindow()
方法则没有重写。
那么此时用语言来形容定时器的开启与关闭。
- 定时器任务(
Runnable
),作为成员变量在View
创建的时候直接创建 -
View
销毁时 ,停止定时器 - 在可见度发生改变的时候
- 如果
View
不可见,停止定时器 - 如果
View
可见,恢复定时器
- 如果
这个
Chronometer
可能是最简单易懂的控件了。
Chronometer 的时间格式处理 (HH:mm:ss)
在updateText()
中通过DateUtils.formatElapsedTime()
来对传入的字符串毫秒值(确切的说应该是秒值)进行格式化.
传入数值265009
返回文本73:36:49