Chronometer的用法很简单,它支持如下用法:
getBase():返回时间。
setBase(long base):设置计时器的起始时间。
start():开始计时。
stop():停止计时。
setFormat(String format):设置显示时间的格式。
setOnChronometerTickListener(Chronometer.OnChronometerTickListener listener):为计时器绑定监听事件。
新增:在res/drawable目录下存放图片文件main3.jpg、smell.jpg。(图片任意)
整体布局为LinearLayout样式,其中包含一个顶端文本显示TestView和两个Linear Layout样式,
第一个LinearLayout中包含一个TestView控件和一个EditText用来输入计时时间;
第二个LinearLayout中包含了四个计时功能按钮,分别为:
btnStart开始计时,btnWait暂停计时,btnStop停止计时,btnReset重置。布局预览结果如下:
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
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