Android基础视图组件之计时器( Chronometer )

2024-02-09 13:18

本文主要是介绍Android基础视图组件之计时器( Chronometer ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安卓系统是内置了计时器(Chronometer)的,但是不很强大,只能显示以秒为单位的计时。如果要具体到毫秒级,就要自己写方法实现了。因为Chronometer这个组件灰常简单,提供的api方法也少,可直接通过例子了解。


计时器(Chronometer)的核心方法有:

start()   //开始计时

stop() //结束计时

setBase() //设置开始时间,一般使用SystemClock.elapsedRealtime()获取当前开始的时间,从00 : 00开始计时

setFormat() //设置计时格式, 比如setFormat( "计时开始:%s" );  //s%就是默认的 MM : SS格式

setOnChronometerTickListenter() //设置计时器的监听器,当计时的值改变会调用这个监听器;如果要清除所添加的监听器,使用setOnChronometerTickListener(null)即可。


先上个演示图:



布局XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent" android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/ll_frg_ob_main"android:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_ob_start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开始"/><Buttonandroid:id="@+id/btn_ob_cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="结束"android:layout_marginLeft="20dp"/><Buttonandroid:id="@+id/btn_ob_wait"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="三秒后自动结束"android:layout_marginLeft="20dp"/></LinearLayout><Chronometerandroid:id="@+id/chron_main"android:layout_width="match_parent"android:layout_height="80dp"android:layout_below="@+id/ll_frg_ob_main"android:layout_marginTop="20dp"android:gravity="center"android:textSize="18sp"android:background="#DDDDDD"/></RelativeLayout>


主类Activity的核心方法:

/*** 设定3秒后自动结束计时器*/private void setTickListener(){//添加监听器,每次计时器的时间改变都会触发这个监听器,3秒后自动结束chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {@Overridepublic void onChronometerTick(Chronometer chronometer) {if(SystemClock.elapsedRealtime() - chronometer.getBase() >= 3000){chronometer.stop();}}});}private class MyOnClickListener implements View.OnClickListener{@Overridepublic void onClick(View v){if(v == btn_start){//去除添加的监听器,因为setTickListener()方法中添加的监听器如果不被去除,会一直限制在3秒自动结束。chronometer.setOnChronometerTickListener(null);//设置开始计时的时间点chronometer.setBase(SystemClock.elapsedRealtime());//开始计时,默认样式是 00:00chronometer.start();}else if(v == btn_cancel){//停止计时chronometer.stop();}else if(v == btn_wait){chronometer.stop();chronometer.setBase(SystemClock.elapsedRealtime());setTickListener();chronometer.start();}}}

上面就是计时器( Chronometer )的使用过程。Chronometer 只能满足一般的使用场景,而且也不是常用的组件。如果要实现比如精确到毫秒,或者复杂格式的计时器,就要考虑用自定义的一系列方法去实时计时,并把计时的结果不断刷新写入要显示数字的组件( 比如TextView )中。

为什么要这么做?我们去看看Chronometer的源码,就会发现其实计时器是继承了TextView的子类,本质上其实也是一个文本框,至于它如何实现逐秒逐秒的计时,也是使用了sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000);这样的方法去计时,用handler每次延时1秒去发送信息,然后刷新计时的结果,就成了我们在视图所看到的一秒一秒增加的效果。了解了这个过程,要自己去实现计时器,也就不难了吧。



这篇关于Android基础视图组件之计时器( Chronometer )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694329

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO