【Android】Chronometer计时器实现计时、停止、暂停、重置功能
【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计时器实现计时、停止、暂停、重置功能相关推荐
- 时间计时android程序,Android 时间计时器控件 Chronometer
当你想要显示时间的推移而不是进程的增加的时候,可以使用Chronometer作为一个计时器.当需要记录用户进行某项操作所消耗的时间的时候,或者在游戏中需要限制时间时候,它将非常实用. 这里,Chron ...
- html计时器重置,使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)...
效果图展示,感觉不错可以参考实例代码. 具体代码如下所示: Document 00:00:00:00 开始 暂停 继续 重置 //定义一个变量,根据定时器每秒执行一次,每次执行++自增操作,变量存储的 ...
- android之计时器chronometer
效果图: activity代码: package cn.com.chenzheng_java; import java.util.Timer; import java.util.TimerTask; ...
- Android Studio计时器的简单使用
Android Studio计时器的简单使用 前言 一.计时操作 1.后台代码展示 2.代码解释 二.源码 总结 前言 唉 本菜鸡又要来献丑了.没办法,为了得到你们的赞,我要更努力才行.好了,开始献丑 ...
- Chronometer 计时器的实现
我要实现的功能是点击按钮开始工作,计时器开始计时,再点停止计时,再点一次接着之前的时间计时.我使用的是Chronometer 控件. 先看布局 <LinearLayout android:lay ...
- Android Wear计时器开发
记得在2013年12月的时候,有系列文章是介绍怎么开发一个智能手表的App,让用户可以在足球比赛中记录停表时间.随着Android Wear的问世,在可穿戴设备中开发一款这样的App确实是个很不错的想 ...
- 秒表计时器开始计时代码_如何在Windows 10中设置计时器,警报和秒表
秒表计时器开始计时代码 For whatever reason, Windows did not include alarms, timers, and stopwatches until Windo ...
- 如何使用html实现在线秒表,使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)...
效果图展示,感觉不错可以参考实例代码. 具体代码如下所示: Document 00:00:00:00 开始 暂停 继续 重置 //定义一个变量,根据定时器每秒执行一次,每次执行++自增操作,变量存储的 ...
- Android Chronometer控件
1. Chronometer类 Chronometer是一个简单的计时器. 主要配置 format,显示格式,默认是"MM:SS"或"H:MM:SS",以%s来 ...
最新文章
- 如何高效地逛Github?
- 转投AI?英国这所大学决定裁掉数学系,激怒了菲尔兹奖得主
- 在docker的Linux容器搭建前端开发环境
- 你的CSDN粉丝为何那么少
- MySQL视图的使用
- 百度Logo月度首页人物--王正华:中国低成本航空第一人
- jQuery easyUI--数据表格 datagrid 的使用
- ITK:区域最小图像过滤器
- java.lang.NoClassDefFoundError
- 支援 Chrome 插件:微软 Chromium 内核 Edge 浏览器可以下载啦!
- 我爱计算机视觉干货集锦分类汇总(2019年5月7日)
- 查询成绩最好的前两名_SQL查询整理
- vue项目中使用lib-flexible解决移动端适配
- excel多元线性拟合_excel透视+多元线性回归
- VUE 分享给好友及朋友圈
- “设计思维”学习——小总结
- 模拟信号和数字信号的区别和特点
- 养生篇01 (饭水分离法)
- js【详解】arr.splice() 数组拼接
- 盖茨鲍尔默曾演黑客帝国疯狂嘲讽 Linux