一、基本定义
Chronometer(计时器)组件与DigitalClock都继承自TextView,因此他们都会显示一段文本。但Chrnometer并不显示当前时间,它显示的是从某个起始时间开始,一共过去了多长时间。
二、属性和方法
1、属性:Chronometer(计时器)组件用法比较简单,它只提供了一个android:format属性,用于指定计时器的计时格式。
2、方法:
方法 | 说明 |
setBase(long base) | 设置计时器的时间格式 |
setFormat(String format) | 设置显示时间的格式 |
start() | 开始计时 |
stop() | 停止计时 |
setOnChronemeterTickListener(Chronometer.OnChronometerTickListener listener) | 为计时器绑定事件监听器,当计时器改变时触发该监听器。 |
三、实现效果
在文本框中输入计时秒数,按“开始”计时,计时结束时出现Toast提醒。如果无时间输入,则Toast提醒输入时间。计时途中可停止。
界面:
。未输入时间提醒:
。时间到的提醒,同时输入框重置:
四、代码编写
1、XML文件中分别放入一个EditText、一个Chronometer和两个Button,并将EditText的输入类型设置为数字(android:inputType="number")。根据自己的喜好将控件摆放。(使用相对布局比较好点)。
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 tools:context=".MainActivity" >
6
7 <EditText
8 android:id="@+id/time"
9 android:layout_width="match_parent"
10 android:layout_height="wrap_content"
11 android:inputType="number"
12 android:hint="请输入计时秒数"/>
13
14 <Chronometer
15 android:id="@+id/chronometer"
16 android:layout_below="@id/time"
17 android:layout_width="wrap_content"
18 android:layout_height="wrap_content"
19 android:layout_centerHorizontal="true"/>
20
21 <Button
22 android:id="@+id/start"
23 android:layout_width="wrap_content"
24 android:layout_height="wrap_content"
25 android:layout_below="@+id/chronometer"
26 android:text="开始计时" />
27
28 <Button
29 android:id="@+id/stop"
30 android:layout_width="wrap_content"
31 android:layout_height="wrap_content"
32 android:layout_below="@id/chronometer"
33 android:layout_toRightOf="@id/start"
34 android:text="停止"/>
35
36 </RelativeLayout>
View Code
2、在MainActivity中建立相应控件,并通过findViewById找到。
1 private Button start,stop;
2 private Chronometer ch;
3 private EditText time;
4
5 @Override
6 protected void onCreate(Bundle savedInstanceState) {
7 super.onCreate(savedInstanceState);
8 setContentView(R.layout.activity_main);
9
10 start = (Button) findViewById(R.id.start);
11 stop = (Button) findViewById(R.id.stop);
12 ch = (Chronometer) findViewById(R.id.chronometer);
13 time = (EditText) findViewById(R.id.time);
View Code
3、建立两个监听器,ButtonListener实现onClickListener接口,ChListener实现OnChronometerTickListener接口。
ButtonListener监听器用于监听start按钮和stop按钮。通过V.getId()判断按了哪个按钮。如果按了start按钮,通过判断EditText中的内容进行不同的操作:如果EditText为空则Toast提醒输入,如果EditText非空则设置计时器时间为系统时钟,并开始计时,同时start按钮不可用。如果按了stop按钮,则停止计时器并重置为系统时钟,清空EditText内容,设置start按钮可用。
判断EditText内容的为空的语句是editText.getText().toString().trim().equals(""),其中trim()方法是拿到里面的东西后,把前后的空格都过滤掉;清空EditText内容的语句是time.setText("")。完整ButtonListene监听器类的代码如下:
1 class ButtonListener implements OnClickListener{
2
3 @Override
4 public void onClick(View v) {
5 if (v.getId() == R.id.start ) {
6 if(time.getText().toString().trim().equals("")){
7 Toast.makeText(MainActivity.this, "请输入时间", Toast.LENGTH_SHORT).show();
8 }else {
9 ch.setBase(SystemClock.elapsedRealtime());
10 ch.start();
11 start.setEnabled(false);
12 }
13 }else if(v.getId() == R.id.stop){
14 ch.stop();
15 ch.setBase(SystemClock.elapsedRealtime());
16 time.setText("");
17 start.setEnabled(true);
18 }
19 }
20 }
View Code
ChListener监听器用于监听计时器。通过判断计时器当前时间(SystemClock.elapsedRealtime())与起始时间(通过getBase()方法获得)的差值控制计时器停止。首先新建一个int变量i,然后将EditText中的内容赋值给i。代码如下:
1 int
代码解析:通过EditText的.getText()方法获得内容,再通过toString()方法将其转成string类型。最后通过整型类里的parseInt(String)方法将string转成int类型。
的当前时间与起始时间的差值,如果大于i*1000(因为计时器是以毫秒为单位的),则停止计时器并Toast提醒,再重置计时器为系统时钟,清空EditText内容,设置start按钮可用。
完整ChListener监听器类代码如下:
1 class ChListener implements OnChronometerTickListener{
2
3 @Override
4 public void onChronometerTick(Chronometer chronometer) {
5 System.out.println("sys"+SystemClock.elapsedRealtime());
6 System.out.println("base"+ch.getBase());
7 int i = Integer.parseInt((time.getText().toString()));
8 if(SystemClock.elapsedRealtime() - ch.getBase() >i*1000){
9 ch.stop();
10 ch.setBase(SystemClock.elapsedRealtime());
11 Toast.makeText(MainActivity.this, "时间到了", Toast.LENGTH_SHORT).show();
12 time.setText("");
13 start.setEnabled(true);
14 }
15 }
16 }
View Code
4、新建ButtonListener监听器并分别绑定至start按钮和stop按钮,新建ChListener监听器并绑定至ch计时器。
1 ButtonListener listener = new ButtonListener();
2 ChListener chListener = new ChListener();
3 start.setOnClickListener(listener);
4 stop.setOnClickListener(listener);
5 ch.setOnChronometerTickListener(chListener);
View Code
五、源代码
1、XML文件
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 tools:context=".MainActivity" >
6
7 <EditText
8 android:id="@+id/time"
9 android:layout_width="match_parent"
10 android:layout_height="wrap_content"
11 android:inputType="number"
12 android:hint="请输入计时秒数"/>
13
14 <Chronometer
15 android:id="@+id/chronometer"
16 android:layout_below="@id/time"
17 android:layout_width="wrap_content"
18 android:layout_height="wrap_content"
19 android:layout_centerHorizontal="true"/>
20
21 <Button
22 android:id="@+id/start"
23 android:layout_width="wrap_content"
24 android:layout_height="wrap_content"
25 android:layout_below="@+id/chronometer"
26 android:text="开始计时" />
27
28 <Button
29 android:id="@+id/stop"
30 android:layout_width="wrap_content"
31 android:layout_height="wrap_content"
32 android:layout_below="@id/chronometer"
33 android:layout_toRightOf="@id/start"
34 android:text="停止"/>
35
36 </RelativeLayout>
View Code
2、MainActivity文件
1 package com.example.chonometer;
2
3 import android.R.integer;
4 import android.hardware.input.InputManager;
5 import android.os.Bundle;
6 import android.os.SystemClock;
7 import android.app.Activity;
8 import android.view.Menu;
9 import android.view.View;
10 import android.view.View.OnClickListener;
11 import android.view.inputmethod.InputMethodManager;
12 import android.widget.Button;
13 import android.widget.Chronometer;
14 import android.widget.EditText;
15 import android.widget.TextView;
16 import android.widget.Toast;
17 import android.widget.Chronometer.OnChronometerTickListener;
18
19 public class MainActivity extends Activity {
20
21 private Button start,stop;
22 private Chronometer ch;
23 private EditText time;
24
25 @Override
26 protected void onCreate(Bundle savedInstanceState) {
27 super.onCreate(savedInstanceState);
28 setContentView(R.layout.activity_main);
29
30 start = (Button) findViewById(R.id.start);
31 stop = (Button) findViewById(R.id.stop);
32 ch = (Chronometer) findViewById(R.id.chronometer);
33 time = (EditText) findViewById(R.id.time);
34
35 ButtonListener listener = new ButtonListener();
36 ChListener chListener = new ChListener();
37 start.setOnClickListener(listener);
38 stop.setOnClickListener(listener);
39 ch.setOnChronometerTickListener(chListener);
40 }
41
42 class ButtonListener implements OnClickListener{
43
44 @Override
45 public void onClick(View v) {
46 if (v.getId() == R.id.start ) {
47 if(time.getText().toString().trim().equals("")){
48 Toast.makeText(MainActivity.this, "请输入时间", Toast.LENGTH_SHORT).show();
49 }else {
50 ch.setBase(SystemClock.elapsedRealtime());
51 ch.start();
52 start.setEnabled(false);
53 }
54 }else if(v.getId() == R.id.stop){
55 ch.stop();
56 ch.setBase(SystemClock.elapsedRealtime());
57 time.setText("");
58 start.setEnabled(true);
59 }
60 }
61 }
62
63 class ChListener implements OnChronometerTickListener{
64
65 @Override
66 public void onChronometerTick(Chronometer chronometer) {
67 System.out.println("sys"+SystemClock.elapsedRealtime());
68 System.out.println("base"+ch.getBase());
69 int i = Integer.parseInt((time.getText().toString()));
70 if(SystemClock.elapsedRealtime() - ch.getBase() >i*1000){
71 ch.stop();
72 ch.setBase(SystemClock.elapsedRealtime());
73 Toast.makeText(MainActivity.this, "时间到了", Toast.LENGTH_SHORT).show();
74 time.setText("");
75 start.setEnabled(true);
76 }
77 }
78 }
79 }