【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() {            @Override            public 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() {                @Override                public 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"?>                            

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() {                @Override                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();                }            });            btnWait.setOnClickListener(new View.OnClickListener() {                @Override                public 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() {                @Override                public 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() {                @Override                public 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() {                        @Override                        public 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() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                        }                    });            AlertDialog dialog = builder.create();            dialog.show();        }    }

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

更多相关文章

  1. 修改android系统和watchdog的延时
  2. Android简易实战教程--第三十九话《Chronometer实现倒计时》
  3. Android(安卓)开发中的倒计时
  4. Android(安卓)Calendar使用过程中遇到的问题
  5. Android执行shell命令
  6. Android中的AlarmManager的使用
  7. android获得系统时间(Handler)
  8. Android简易闹钟实现
  9. Flutter 与 Android(安卓)相互调用、传递参数

随机推荐

  1. [Android(安卓)Pro] android 混淆文件pro
  2. Android(安卓)Studio、Android(安卓)SDK
  3. LinearLayout布局之weight
  4. android 拍照+从手机相册选择返回图片到i
  5. Android(安卓)生成keystore(user & debug
  6. android:visibility="gone"
  7. android studio中运行main方法报错问题解
  8. Android(安卓)Studio 解决方法No JVM ins
  9. android:xml创建menu
  10. Android(安卓)判断SD卡是否存在及容量查