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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:gravity="center"
        android:text="Chronometer计时器"
        android:textColor="#000000"
       android:layout_marginBottom="60dp"
        android:textSize="40dp" />
    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:orientation="horizontal">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:gravity="center"
        android:textStyle="bold"
        android:text="设置时间(s):"/>
    <EditText
        android:id="@+id/edt_settime"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:inputType="number"/>
</LinearLayout>
<Chronometer
    android:id="@+id/chronometer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:textColor="#000000"
    android:textSize="60dip"/>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dip"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btnStart"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="开始计时" />
        <Button
            android:id="@+id/btnWait"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="暂停计时" />
        <Button
            android:id="@+id/btnStop"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="停止计时" />

        <Button
            android: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() {
                @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

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AndroidChronometer控件可以用于实现计时器功能,包括正计时和倒计时。如果想要实现计时,需要在代码中设置Chronometer控件的计时时间,并在倒计时结束时触发相关操作。 具体实现方式如下: 1. 在布局文件中添加Chronometer控件: ``` <Chronometer android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:format="倒计时:%s" android:layout_centerInParent="true"/> ``` 其中,format属性用于设置Chronometer控件显示的文本格式,%s表示计时器的时间将会被替换为具体的倒计时时间。 2. 在代码中设置倒计时时间: ``` Chronometer chronometer = findViewById(R.id.chronometer); chronometer.setBase(SystemClock.elapsedRealtime() + 10 * 1000); //设置倒计时时间为10秒 chronometer.start(); //开始倒计时 ``` 其中,setBase方法用于设置Chronometer控件的起始时间,这里使用SystemClock.elapsedRealtime()获取当前时间,再加上10秒的时间作为起始时间,即表示倒计时从当前时间开始,倒计时时间为10秒。start方法用于开始倒计时。 3. 在倒计时结束时触发相关操作: ``` chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() { @Override public void onChronometerTick(Chronometer chronometer) { if (chronometer.getText().toString().equals("00:00")) { //倒计时结束,执行相关操作 chronometer.stop(); //停止计时 } } }); ``` 在倒计时过程中,可以通过设置setOnChronometerTickListener监听器,在每秒钟的时钟周期中判断Chronometer控件显示的时间是否为00:00,如果是则表示倒计时结束,可以在这里触发相关操作。同时,需要在倒计时结束时停止Chronometer计时器,避免继续计时

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值