1. Chronometer类

Chronometer是一个简单的计时器。

主要配置

  • format,显示格式,默认是"MM:SS"或"H:MM:SS",以%s来格式化。
  • countDown,是否倒计时,与base时间相比较

主要方法

  • start(),开始计时
  • stop(),停止计时
  • setBase(long),设置计时基准时间
  • setFormat(String),设置显示格式
  • setCountDown(boolean),设置是否是倒计时,只有版本大于24才有效
  • setOnChronometerTickListener(OnChronometerTickListener),设置监听器

实例代码

mChronometer.setBase(SystemClock.elapsedRealtime());
mChronometer.setFormat("计时开始 %s");
mChronometer.start();

效果如下

2. Chronometer代码分析

start()stop()方法修改了mStarted的状态,然后调用updateRunning()
Chronometer状态由三部分组成,mVisible(Window是否可见)、mStarted(Chronometer开始计时)和isShown(View是否可见)。如果状态变化,修改当前控件。updateText(long)修改界面,dispatchChronometerTick()触发监听事件。postDelayed(Runnable, long)在一秒后修改界面。

public void start() {mStarted = true;updateRunning();
}public void stop() {mStarted = false;updateRunning();
}private void updateRunning() {boolean running = mVisible && mStarted && isShown();if (running != mRunning) {if (running) {updateText(SystemClock.elapsedRealtime());dispatchChronometerTick();postDelayed(mTickRunnable, 1000);} else {removeCallbacks(mTickRunnable);}mRunning = running;}
}private final Runnable mTickRunnable = new Runnable() {@Overridepublic void run() {if (mRunning) {updateText(SystemClock.elapsedRealtime());dispatchChronometerTick();postDelayed(mTickRunnable, 1000);}}
};

updateText(long)修改当前界面,首先拿当前时间和mBase时间作比较,second是两种之间的差值。DateUtilssecond格式化,一般是"MM:SS"或"H:MM:SS",输出text。如果定义了format格式,利用Formattertext进一步格式化。

private synchronized void updateText(long now) {mNow = now;long seconds = mCountDown ? mBase - now : now - mBase;seconds /= 1000;boolean negative = false;if (seconds < 0) {seconds = -seconds;negative = true;}String text = DateUtils.formatElapsedTime(mRecycle, seconds);if (negative) {text = getResources().getString(R.string.negative_duration, text);}if (mFormat != null) {Locale loc = Locale.getDefault();if (mFormatter == null || !loc.equals(mFormatterLocale)) {mFormatterLocale = loc;mFormatter = new Formatter(mFormatBuilder, loc);}mFormatBuilder.setLength(0);mFormatterArgs[0] = text;try {mFormatter.format(mFormat, mFormatterArgs);text = mFormatBuilder.toString();} catch (IllegalFormatException ex) {if (!mLogged) {Log.w(TAG, "Illegal format string: " + mFormat);mLogged = true;}}}setText(text);
}

dispatchChronometerTick()触发监听事件。

void dispatchChronometerTick() {if (mOnChronometerTickListener != null) {mOnChronometerTickListener.onChronometerTick(this);}
}

setFormat(String)设置显示格式

public void setFormat(String format) {mFormat = format;if (format != null && mFormatBuilder == null) {mFormatBuilder = new StringBuilder(format.length() * 2);}
}

setBase(long)设置计时基准时间

public void setBase(long base) {mBase = base;dispatchChronometerTick();updateText(SystemClock.elapsedRealtime());
}

相关文章
Android Picker控件
Android Clock控件
Android Chronometer控件
Android Handler类
Java Formatter类

Android Chronometer控件相关推荐

  1. Android Clock控件

    1. AnalogClock模拟时钟 属性配置 dial,表盘背景 hand_hour,时针图片 hand_minute,秒针图片 配置文件 <AnalogClockandroid:layout ...

  2. Chronometer控件实现的Android计时器

    本文为大家演示了如何使用Chronometer控件实现Android计时器的实例. 先贴上最终的实现效果图: Android计时器实现思路 使用Chronometer控件实现计器的操作.通过设置set ...

  3. 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab

    [索引页] [×××] 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab, Spi ...

  4. Android神奇“控件”-----RemoteViews

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请注明 http://blog.csdn.net/wrg_20100512/article/details/53940485 好 ...

  5. Android 原生控件之一 TextView

    Android 原生控件之一 TextView 前言 来源 开始 XML属性 1.android:allowUndo 2.android:autoLink 3.android:autoSizeMaxT ...

  6. 【Android从零单排系列十一】《Android视图控件——日历、日期、时间选择控件》

    目录 一.日历.日期.时间组件基本介绍 二.几种常见的控件类型 1.CalendarView –日历控件 2. DatePicker –日期选择控件 3.TimePicker –时间选择控件 4.Ch ...

  7. Android开源控件ViewPager Indicator的使用方法

     1月16日厦门 OSC 源创会火热报名中,奖品多多哦   摘要 Android开源控件ViewPager Indicator的使用介绍 ViewPagerIndicator 目录[-] 1. V ...

  8. 日历控件的android代码,Android日历控件PickTime代码实例

    Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...

  9. android 获取控件高度_安卓开发入门教程UI控件_ImageView

    什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...

最新文章

  1. 七基于Fourinone实现MQ demo
  2. Python(数据库之表操作)
  3. 一日千里 云计算普及势不可挡
  4. java friendly 子包,黑馬程序員 java 修飾符類型(public,protected,private,friendly)
  5. stm32 led屏控制卡_室内LED显示屏如何安装?
  6. 2020最新Java线程池入门(超详细)
  7. Ubuntu 16.04 + Nginx + Django 项目部署
  8. 【arthas】Arthas 查看 Mbean 的信息
  9. Oracle 11g-R2 SQL Developer连接MSSQL2008
  10. nvidia-rapids︱cuGraph(NetworkX-like)关系图模型
  11. SQLHelper类方法介绍及简单使用
  12. 解决Mac系统读写NTFS格式移动硬盘
  13. 【正点原子STM32连载】 第六十四章 综合测试实验摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  14. 【资损】系统迭代过程中的兼容性设计
  15. 不做自了汉,大家好才是真的好
  16. Hadoop安装与环境配置
  17. Matlab2017a中帮助文档无法设置为中文的一种解决办法
  18. [附源码]java毕业设计校园征兵及退役复原管理系统
  19. Java二维数组详解:二维数组的声明和初始化,以及获取二维数组的值
  20. SSH服务端配置、优化加速、安全防护

热门文章

  1. 基于MATLAB的车牌识别系统设计与实现
  2. 陋室快报 | BERT主流衍生语言模型-20211106
  3. Go语言自学系列 | golang标准库bytes
  4. c语言程序在什么结束执行,c程序的执行是从什么开始到什么结束?
  5. 易中天的十句话---也许对每个人都会有一点启发
  6. 策略研究框架:少即是多【附下载链接】
  7. 不锈钢和铝合金电饭锅哪个好
  8. 小米手机加载h5页面加载不出图片
  9. postfix MySQL配置_postfix+mysql
  10. 为什么我会持续关注香港事件