|
模拟/数字/线程小时钟设计
AnalogClock 与 DigitalClock 的原理--线程时钟实现
①新建工程
②修改 man.xml 布局,添加一个 AnalogClock、一个 DigitalClock、一个 TextView
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/TextView_showTime"
android:layout_width="200px"
android:layout_height="39px"
android:textSize="25px"
android:layout_x="82px"
android:layout_y="222px">
</TextView>
<AnalogClock
android:id="@+id/Clock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="82px"
android:layout_y="34px">
</AnalogClock>
<DigitalClock
android:id="@+id/DigitalClock01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上午1:01"
android:textSize="25px"
android:layout_x="82px"
android:layout_y="300px">
</DigitalClock>
<TextView
android:id="@+id/widget46"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="模拟时钟"
android:layout_x="11px"
android:layout_y="46px">
</TextView>
<TextView
android:id="@+id/widget47"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="线程时钟"
android:layout_x="11px"
android:layout_y="228px">
</TextView>
<TextView
android:id="@+id/widget48"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="数字时钟"
android:layout_x="11px"
android:layout_y="308px">
</TextView>
</AbsoluteLayout>
复制代码③模拟时钟的实现不需要额外代码,只需要 UI 中添加,其自动显示时间
/*定义模拟时钟对象*/
AnalogClock myClock;
/*从XML中获取模拟时钟UI对象*/
myClock=(AnalogClock)findViewById(R.id.Clock);
复制代码
④数字时钟的实现也不需要额外代码,只需要 UI 中添加,其自动显示时间
/*定义数字时钟对象*/
DigitalClock myDigClock;
/*从XML中获取数字时钟UI对象*/
myDigClock=(DigitalClock)findViewById(R.id.DigitalClock01);
复制代码
⑤而使用线程实现的 TextView 时钟则需要线程 Thread、Handler(发送、处理消息)辅助实现
import android.os.Handler;
import android.os.Message;
public class Clock extends Activity implements Runnable{
public Handler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.gh);
myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
}
};
Thread myT = new Thread(this);
myT.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}
复制代码
⑥修改mianActivity.java,实现线程控制,以及模拟/数字时钟的实现
package zyf.three.clock;
/*导入要使用的包*/
import java.util.Calendar;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.AnalogClock;
import android.widget.DigitalClock;
import android.widget.TextView;
public class Clock extends Activity implements Runnable {
/* 定义要使用的类对象 */
private TextView showTime;// 显示进程时钟的TextView
AnalogClock myClock;// 模拟时钟
DigitalClock myDigClock;// 数字时钟
private final int msg_Key = 0x1234;// 发送的消息内容
public Handler myHandler;// 发送、处理消息的类
public Calendar myCalendar;// 日历类
private int my_Hour, my_Minute, my_Second;// 时、分、秒
private Thread myT;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
/* 导入主屏布局main.xml */
setContentView(R.layout.gh);
/* 从XML中获取模拟时钟UI对象 */
myClock = (AnalogClock) findViewById(R.id.Clock);
/* 从XML中获取数字时钟UI对象 */
myDigClock = (DigitalClock) findViewById(R.id.DigitalClock01);
/* 从XML中获取TextView UI对象 */
showTime = (TextView) findViewById(R.id.TextView_showTime);
/* 通过Handler 来接收进程所传递的信息并更新TextView */
myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
/* 这里是处理信息的方法 */
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case msg_Key:
/* 在这处理要TextView对象Show时间的事件 */
showTime.setText(my_Hour + " : " + my_Minute + " : "
+ my_Second);
break;
default:
break;
}
}
};
/* 通过进程来持续取得系统时间 */
myT = new Thread(this);
myT.start();
}
/* 实现一个Runable接口,实例化一个进程对象, 用来持续取得系统时间 */
@Override
public void run() {
// TODO Auto-generated method stub
try {
do {
/* 取得系统时间 */
long Time = System.currentTimeMillis();
myCalendar = Calendar.getInstance();
myCalendar.setTimeInMillis(Time);
my_Hour = myCalendar.get(Calendar.HOUR);
my_Minute = myCalendar.get(Calendar.MINUTE);
my_Second = myCalendar.get(Calendar.SECOND);
/* 让进程休息一秒 */
Thread.sleep(1000);
/* 重要关键程序:取得时间后发出信息给Handler */
Message msg = new Message();
msg.what = msg_Key;
myHandler.sendMessage(msg);
/* 重要关键程序:取得时间后发出信息给Handler */
} while (myT.interrupted() == false);
/* 当系统发出中断信息时停止本循环 */
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
复制代码结果: |
|