前一天我们学习了学习了状态切换按键的使用方法,通过ToggleButton控件实现。ToggleButton按键包含两个状态:选中和未选中。可以通过对该按键添加监听事件来获取这两个状态,之后可以重载onCheckedChanged()方法,在该方法中,根据不同状态进行不同的处理。

今天将学习时钟及定时器的实现。时钟与定时器的效果如图1所示。

java timeoutexcetion模拟 java模拟时钟_时钟

图1 时钟及定时器

界面的上半部分是两种时钟,用来显示系统当前时间。下半部分是一个定时器,在输入等待时间后点击“点击开始”按键,最下方的计时器开始计时,到了指定的等待时间后,则停止计时。

1 时钟的实现

时钟是通过时钟控件实现的。时钟控件分为两种,一种是数字时钟控件DigitalClock在图1中红色数字即为数字时钟,另外一种是模拟时钟控件AnalogClock,图1中上半部分的时钟即为模拟时钟。其中,数字时钟控件继承自TextView,而模拟时钟控件继承自View。

通过在界面布局文件中添加两个时钟控件即可实现图1所示效果。

<AnalogClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<DigitalClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14pt"
android:textColor="#FF0000"
/>

因为DigitalClock继承自TextView,所以它可以使用TextView的属性设置其字体大小和颜色等。

2 定时器的实现

定时器是由EditText控件、Button控件和计时器Chronometer控件组成。EditText控件用来输入指定的时间,Button控件用来开始计时,Chronometer控件用来计时。

2.1 EditText控件的添加

在界面布局文件中添加EditText控件,并设置控件的属性,代码如下所示。

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:maxLength="6"
android:drawableLeft="@drawable/ic_launcher"
android:id="@+id/EditText_Second"
       android:hint="请输入等待时间..."
/>

其中,“android:inputType”表示在控件中输入内容的类型,“number”表示在控件中输入的类型是数字,当点击控件输入内容时,会弹出数字软键盘,如图2-1所示;“android:maxLength”表示输入数字的最大位数;“android:drawableLeft”指定了在控件左侧显示的图标;“android:hint”表示在未输入内容前,控件显示的提示内容,当在控件中输入内容时,提示内容消失。

java timeoutexcetion模拟 java模拟时钟_控件_02

图2-1 弹出数字按键

2.2 Button控件的添加

在界面布局文件中添加Button控件,并设置其id、layout_width、layout_height和text属性。

2.3 Chronometer控件的添加

在界面布局文件中添加Chronometer控件,Chronometer控件派生自TextView控件,因此可以使用TextView控件的属性设置其颜色和字体等。

<Chronometer
android:id="@+id/Chronometer_My"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:textSize="30pt"
/>

2.4 按键监听事件的绑定

在EditText控件中输入指定的时间后,点击按键,开始计时。因此,需要对按键进行监听事件的绑定。

1       button_start.setOnClickListener(new OnClickListener(){
2            @Override
3           publicvoid onClick(View source)
4           {
5              chrono.setBase(SystemClock.elapsedRealtime());
6              chrono.start();
7           }
8     });

其中,第1行中的button_start是通过getViewById()方法获取到的按键控件;在onClick()方法中设置计时器的起始事件并且开始计时。第5行中的chrono是通过getViewById获取到的Chronometer控件,第5行的setBase()方法用来设置计时器的起始时间,SystemClock.elapsedRealtime()是自从系统开机到现在的时间,单位是毫秒;第6行中的start()方法用来启动计时器。

2.5 计时器监听事件的绑定

通过setOnChronometerTickListener()方法实现计时器监听事件的绑定。当计时器所记得时间发生改变时,就会调用该方法设置的监听器。该方法的参数是Chronometer.OnChronometerTickListener接口,重载该接口的onChronometerTick()方法,在该方法中判断计时器当前的时间与指定时间的关系。代码如下所示:

1       chrono.setOnChronometerTickListener(new 3
2 OnChronometerTickListener(){
3           @Override
4           publicvoidonChronometerTick(Chronometer ch)
5           {
6              if( SystemClock.elapsedRealtime() - ch.getBase()
7                 > 
8                Integer.parseInt(editText_WaitTime.getText().toString())*1000)
9              {
10                 ch.stop();
11             }
12          }
13});

onChronometerTick()方法的参数是Chronometer类的对象;第6行中使用getBase获取在键盘监听器中设置的计时器的起始时间,第6行表达式的含义是从计时时间开始计时器所记得时间;第8行中,editText_WaitTime是用于输入等待时间的EditText控件,getText()方法是获取该控件中输入的时间,第6行中时间的单位是毫秒,而EditText控件中输入的数字的单位是秒,因此在第8行中需要乘以1000,第8行表达式的含义是获取输入的等待时间;当计时器所记得时间大于指定的等待时间时,调用stop()方法停止计时。

3小结

今天学习了时钟的创建以及定时器的实现。通过DigitalClock控件和AnalogClock控件可以实现数字时钟和模拟时钟。通过Chronometer控件的启动和停止,可以实现定时器的功能。Chronometer控件监听事件的绑定是通过setOnChronometerTickListener()方法实现的。