【Android】Button+Chronometer计时器实现计时、停止、暂停、重置功能!

一、简介

Chronometer的用法很简单,它支持如下用法:
getBase():返回时间。
setBase(long base):设置计时器的起始时间。
start():开始计时。
stop():停止计时。
setFormat(String format):设置显示时间的格式。
setOnChronometerTickListener(Chronometer.OnChronometerTickListener listener):为计时器绑定监听事件。

二、项目结构

新增:在res/drawable目录下存放图片文件main3.jpg、smell.jpg。(图片任意)

三、Activity_main.xml文件

整体布局为LinearLayout样式,其中包含一个顶端文本显示TestView和两个Linear Layout样式,
第一个LinearLayout中包含一个TestView控件和一个EditText用来输入计时时间;
第二个LinearLayout中包含了四个计时功能按钮,分别为:
btnStart开始计时,btnWait暂停计时,btnStop停止计时,btnReset重置。布局预览结果如下:

四、MainActivity.java

A、定义私有变量:

private int startTime = 0;
private Chronometer recordChronometer;
private long recordingTime = 0;// 记录下来的总时间
private Context context ;

B、在onCreate方法中获取获取计时数和按钮id:

final Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);
Button btnStart = (Button) findViewById(R.id.btnStart);
Button btnWait=(Button)findViewById(R.id.btnWait);
Button btnStop = (Button) findViewById(R.id.btnStop);
Button btnRest = (Button) findViewById(R.id.btnReset);
final EditText edtSetTime = (EditText) findViewById(R.id.edt_settime);

C、设置四个按钮监听事件:
1)开始计时事件:

public void onClick(View v) {Toast t = Toast.makeText(context,"开始记时", Toast.LENGTH_LONG);t.show();String ss = edtSetTime.getText().toString();if (!(ss.equals("") && ss != null)) {startTime = Integer.parseInt(edtSetTime.getText().toString());}// 跳过已经记录了的时间,起到继续计时的作用chronometer.setBase(SystemClock.elapsedRealtime()-recordingTime);// 开始记时chronometer.start();
}

2)暂停计时事件:

Toast t = Toast.makeText(context,"暂停记时", Toast.LENGTH_LONG);
t.show();
chronometer.stop();
// 保存这次记录了的时间。SystemClock.elapsedRealtime()是系统启动到现在的毫秒数
recordingTime=SystemClock.elapsedRealtime()-chronometer.getBase();//getBase():返回时间

3)停止计时事件:

Toast t = Toast.makeText(context,"停止记时", Toast.LENGTH_LONG);
t.show();
recordingTime=0;
chronometer.stop();

4)重置事件:

Toast t = Toast.makeText(context,"重置计时", Toast.LENGTH_LONG);
t.show();
recordingTime=0;
chronometer.setBase(SystemClock.elapsedRealtime());// setBase():设置计时器的起始时间
edtSetTime.setText(null);//输入框清空

D、计时器监听:

chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {@Overridepublic void onChronometerTick(Chronometer chronometer) {// 如果开始计时到现在大于等于了startime秒if (SystemClock.elapsedRealtime()- chronometer.getBase() >=startTime * 1000) {chronometer.stop();showDialog();// 给用户提示}}});showDialog()函数:AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setIcon(R.drawable.smell);final EditText edtSetTime = (EditText) findViewById(R.id.edt_settime);String ss = edtSetTime.getText().toString();builder.setTitle("温馨提示:").setMessage("您设置的时间"+ss+"(s)已到~~~").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});AlertDialog dialog = builder.create();dialog.show();
}

五、模拟机运行结果

1)输入计时时间(以秒为单位):10,
2)点击“开始计时”:弹出提示框并开始计时
3)点击“停止计时”:弹出提示框,停止计时,系统已计时时间清零
4)点击“开始计时”:重头开始计时
5)点击“暂停计时”:弹出提示框,保存系统已计时时间
6)点击“开始计时”:弹出提示框,继续计时
7)计时结束,:弹出提示框
8)点击“重置”:弹出提示框,计时清零,输入框和计时时间清零。


六、总结

stop()方法只是停止刷新计时器的时间显示,而并没有真正停止计时。
当调用stop()方法后,计时器还在计时,只是不再刷新界面罢了。
在构建计时器暂停功能时,应该是让计时器在恢复计时能够从暂停前的时间继续计时。
定义了变量private long recordingTime,当点击暂停按钮时,用recordingTime保存本次记录了的时间,当再次点击开始时,则开始时间不再是0,而是SystemClock.elapsedRealtime()-recordingTime。跳过已经记录了的时间,起到继续计时的作用。

源代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"android:background="@drawable/main3"tools:context=".MainActivity"><TextViewandroid:layout_width="match_parent"android:layout_height="60dp"android:gravity="center"android:text="Chronometer计时器"android:textColor="#000000"android:layout_marginBottom="60dp"android:textSize="40dp" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:orientation="horizontal"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="3"android:gravity="center"android:textStyle="bold"android:text="设置时间(s):"/><EditTextandroid:id="@+id/edt_settime"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:inputType="number"/>
</LinearLayout>
<Chronometerandroid:id="@+id/chronometer"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:textColor="#000000"android:textSize="60dip"/><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_margin="10dip"android:orientation="horizontal" ><Buttonandroid:id="@+id/btnStart"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="开始计时" /><Buttonandroid:id="@+id/btnWait"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="暂停计时" /><Buttonandroid:id="@+id/btnStop"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="停止计时" /><Buttonandroid:id="@+id/btnReset"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="重置" /></LinearLayout>
</LinearLayout>

MainActivity.java

package com.example.machronometer;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.SystemClock;
import android.text.format.Time;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.EditText;
import android.widget.Toast;import static java.security.AccessController.getContext;public class MainActivity extends AppCompatActivity {private int startTime = 0;private Chronometer recordChronometer;private long recordingTime = 0;// 记录下来的总时间private Context context ;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);context = this;final Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);Button btnStart = (Button) findViewById(R.id.btnStart);Button btnWait=(Button)findViewById(R.id.btnWait);Button btnStop = (Button) findViewById(R.id.btnStop);Button btnRest = (Button) findViewById(R.id.btnReset);final EditText edtSetTime = (EditText) findViewById(R.id.edt_settime);btnStart.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast t = Toast.makeText(context,"开始记时", Toast.LENGTH_LONG);t.show();String ss = edtSetTime.getText().toString();if (!(ss.equals("") && ss != null)) {startTime = Integer.parseInt(edtSetTime.getText().toString());}// 跳过已经记录了的时间,起到继续计时的作用chronometer.setBase(SystemClock.elapsedRealtime()-recordingTime);// 开始记时chronometer.start();}});btnWait.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast t = Toast.makeText(context,"暂停记时", Toast.LENGTH_LONG);t.show();chronometer.stop();// 保存这次记录了的时间//SystemClock.elapsedRealtime()是系统启动到现在的毫秒数recordingTime=SystemClock.elapsedRealtime()-chronometer.getBase();//getBase():返回时间}});btnStop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 停止Toast t = Toast.makeText(context,"停止记时", Toast.LENGTH_LONG);t.show();recordingTime=0;chronometer.stop();
//                    recordChronometer.setBase(SystemClock.elapsedRealtime());}});// 重置btnRest.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast t = Toast.makeText(context,"重置计时", Toast.LENGTH_LONG);t.show();recordingTime=0;chronometer.setBase(SystemClock.elapsedRealtime());// setBase(long base):设置计时器的起始时间edtSetTime.setText(null);//输入框清空}});chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {@Overridepublic void onChronometerTick(Chronometer chronometer) {// 如果开始计时到现在超过了startime秒if (SystemClock.elapsedRealtime()- chronometer.getBase() > startTime * 1000) {chronometer.stop();// 给用户提示showDialog();}}});}protected void showDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setIcon(R.drawable.smell);final EditText edtSetTime = (EditText) findViewById(R.id.edt_settime);String ss = edtSetTime.getText().toString();builder.setTitle("温馨提示:").setMessage("您设置的时间"+ss+"(s)已到~~~").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});AlertDialog dialog = builder.create();dialog.show();}}

参考:https://blog.csdn.net/weixin_34060741/article/details/85652887

【Android】Chronometer计时器实现计时、停止、暂停、重置功能相关推荐

  1. 时间计时android程序,Android 时间计时器控件 Chronometer

    当你想要显示时间的推移而不是进程的增加的时候,可以使用Chronometer作为一个计时器.当需要记录用户进行某项操作所消耗的时间的时候,或者在游戏中需要限制时间时候,它将非常实用. 这里,Chron ...

  2. html计时器重置,使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)...

    效果图展示,感觉不错可以参考实例代码. 具体代码如下所示: Document 00:00:00:00 开始 暂停 继续 重置 //定义一个变量,根据定时器每秒执行一次,每次执行++自增操作,变量存储的 ...

  3. android之计时器chronometer

    效果图: activity代码: package cn.com.chenzheng_java; import java.util.Timer; import java.util.TimerTask; ...

  4. Android Studio计时器的简单使用

    Android Studio计时器的简单使用 前言 一.计时操作 1.后台代码展示 2.代码解释 二.源码 总结 前言 唉 本菜鸡又要来献丑了.没办法,为了得到你们的赞,我要更努力才行.好了,开始献丑 ...

  5. Chronometer 计时器的实现

    我要实现的功能是点击按钮开始工作,计时器开始计时,再点停止计时,再点一次接着之前的时间计时.我使用的是Chronometer 控件. 先看布局 <LinearLayout android:lay ...

  6. Android Wear计时器开发

    记得在2013年12月的时候,有系列文章是介绍怎么开发一个智能手表的App,让用户可以在足球比赛中记录停表时间.随着Android Wear的问世,在可穿戴设备中开发一款这样的App确实是个很不错的想 ...

  7. 秒表计时器开始计时代码_如何在Windows 10中设置计时器,警报和秒表

    秒表计时器开始计时代码 For whatever reason, Windows did not include alarms, timers, and stopwatches until Windo ...

  8. 如何使用html实现在线秒表,使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)...

    效果图展示,感觉不错可以参考实例代码. 具体代码如下所示: Document 00:00:00:00 开始 暂停 继续 重置 //定义一个变量,根据定时器每秒执行一次,每次执行++自增操作,变量存储的 ...

  9. Android Chronometer控件

    1. Chronometer类 Chronometer是一个简单的计时器. 主要配置 format,显示格式,默认是"MM:SS"或"H:MM:SS",以%s来 ...

最新文章

  1. 如何高效地逛Github?
  2. 转投AI?英国这所大学决定裁掉数学系,激怒了菲尔兹奖得主
  3. 在docker的Linux容器搭建前端开发环境
  4. 你的CSDN粉丝为何那么少
  5. MySQL视图的使用
  6. 百度Logo月度首页人物--王正华:中国低成本航空第一人
  7. jQuery easyUI--数据表格 datagrid 的使用
  8. ITK:区域最小图像过滤器
  9. java.lang.NoClassDefFoundError
  10. 支援 Chrome 插件:微软 Chromium 内核 Edge 浏览器可以下载啦!
  11. 我爱计算机视觉干货集锦分类汇总(2019年5月7日)
  12. 查询成绩最好的前两名_SQL查询整理
  13. vue项目中使用lib-flexible解决移动端适配
  14. excel多元线性拟合_excel透视+多元线性回归
  15. VUE 分享给好友及朋友圈
  16. “设计思维”学习——小总结
  17. 模拟信号和数字信号的区别和特点
  18. 养生篇01 (饭水分离法)
  19. js【详解】arr.splice() 数组拼接
  20. 盖茨鲍尔默曾演黑客帝国疯狂嘲讽 Linux

热门文章

  1. Mac如何使用自带的录屏软件
  2. 欧盟商标和马德里商标有什么区别?
  3. OllyDBG 鱼C工作室专用调试工具
  4. ubuntu连不上网
  5. ELF文件解析 ELF File Parsing
  6. 转自开复学生网的一篇文章
  7. python画彩虹和小熊
  8. 拉格朗日乘子法及拉格朗日中值定理
  9. 认识MSCI ESG评级
  10. Java中文字编码问题详解