- 模拟/数字/线程小时钟设计
- 动态输入日期与时间
- 日期设置/时间设置对话框
21. 模拟/数字/线程小时钟设计
AnalogClock 与DigitalClock 的原理,以及线程时钟的实现 。
示例代码
① 新建工程
② 修改man.xml 布局,添加一个AnalogClock、一个DigitalClock、一个TextView
<TextView //这个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>
③ 模拟时钟的实现不需要额外代码,只需要UI 中添加,其自动显示时间
④ 数字时钟的实现也不需要额外代码,只需要UI 中添加,其自动显示时间
⑤ 而使用线程实现的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();
}
}
}
⑦ 结果
关键点
1. 模拟时钟 AnalogClock
不需要额外代码,只需要在UI中添加,其自动显示时间。
2. 数字时钟 DigitalClock
数字时钟,显示到秒,修正:分开显示小时/分钟/秒,均衡的字体不能够摆动显示。(译者注:根据字体按比例显示小时/分钟/秒,无法像AnalogClock转动显示)
3. 线程显示时间
1)如何启动一个线程
java中创建一个线程,有两种方式:继承 Thread类 与 实现Runnable接口 。
* 继承 Thread类:
Thread类里的run方法,就是线程执行内容方法。线程通过 .start()启动。
示例:
public calss threadA extends Thread
{
public threadA(){}
public void run (){ 线程执行内容 }
public static void main()
{
Thread testA = new threadA();
threadA.start();
}
}
* 实现 Runnable 接口:
实现Runnable接口,在启动时也是需要根据这个runnable实例构造一个Thread实例进行start 。
示例:
public calss RunnableA implements Runnable
{
public RunnableA(){}
public void run (){ 线程执行内容 }
}
public class testThreadB()
{
RunnableA runA = new RunnableA();
Thread testB = new Thread(runA );
testB.start();
}
2)handle 类的消息处理
http://book.51cto.com/art/201010/231862.htm
http://wenku.baidu.com/view/c0359b20dd36a32d7375818e.html
http://wenku.baidu.com/view/0c4bac671ed9ad51f01df27a.html
3)System.currentTimeMillis
* System类:
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
* System.currentTimeMillis()
Returns the current system time in milliseconds since January 1, 1970 00:00:00 UTC.
4)Calendar 日历类
22.动态输入日期与时间
DatePicker 与TimePicker 应用。
示例代码
① 新建工程
② 修改main.xml 布局,添加一个DatePicker、一个TimePicker、一个TextView
<DatePicker
android:id="@+id/my_DatePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="10px"
android:layout_y="10px">
</DatePicker><!-- 日期设置器-->
<TimePicker
android:id="@+id/my_TimePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="10px"
android:layout_y="150px">
</TimePicker><!-- 时间设置器-->
<TextView
android:id="@+id/my_TextView"
android:layout_width="228px"
android:layout_height="29px"
android:text="TextView"
android:layout_x="10px"
android:layout_y="300px">
</TextView>
③ DatePicker 的初始化与日期改变事件的处理
// 定义程序用到的UI元素对象:日历设置器
DatePicker my_datePicker;
//findViewById()从XML中获取UI元素对象
my_datePicker = (DatePicker) findViewById(R.id.my_DatePicker);
//为日历设置器添加点击事件监听器,处理设置日期事件
my_datePicker.init(my_Year, my_Month, my_Day,new DatePicker.OnDateChangedListener(){
@Override
public void onDateChanged(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
// TODO Auto-generated method stub
//日期改变事件处理
}
});
④ TimePicker 的初始化与时间改变事件的处理
// 定义程序用到的UI元素对象:时间设置器
TimePicker my_timePicker;
// findViewById()从XML中获取UI元素对象
my_timePicker = (TimePicker) findViewById(R.id.my_TimePicker);
// 把时间设置成24小时制
my_timePicker.setIs24HourView(true);
//为时间设置器添加点击事件监听器,处理设置时间事件
my_timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener(){
@Override
public void onTimeChanged(TimePicker view, int hourOfDay,int minute) {
// TODO Auto-generated method stub
//时间改变事件处理
}
});
⑤ 修改mainActivity.java,添加动态修改时间并显示效果
......
⑥ 结果
关键点
23. 日期设置/时间设置 对话框
DatePickerDialog 与 TimePickerDialog 应用。
示例代码
① 新建工程
② 修改main.xml 布局,添加两个按钮、一个TextView
<Button
android:id="@+id/show_DatePicker"
android:layout_width="150px"
android:layout_height="wrap_content"
android:layout_x="10px"
android:layout_y="10px" android:text="显示日期设置对话框"/>
<Button
android:id="@+id/show_TimePicker"
android:layout_width="150px"
android:layout_height="wrap_content"
android:layout_x="10px"
android:layout_y="70px" android:text="显示时间设置对话框"/>
<TextView
android:id="@+id/my_TextView"
android:layout_width="228px"
android:text="TextView"
android:layout_x="10px"
android:layout_y="180px"
android:layout_height="45px"
android:textSize="20px"/>
③ DatePickerDialog 的定义与初始化以及显示
// 定义程序用到的UI元素对象:日历设置器对话框
DatePickerDialog my_datePickerDialog;
//构造一个DatePickerDialog对象,第一个参数为Context、
// 第二参数为日期修改事件处理监听器、后面为初始化的年月日
my_datePickerDialog=new DatePickerDialog(Ex_Ctrl_15_B.this,
myDateSetListener, my_Year, my_Month, my_Day);
//显示出日期设置对话框
my_datePickerDialog.show();
④ DatePickerDialog 的日期修改事件处理
//日期改变设置事件监听器
private OnDateSetListener myDateSetListener=new OnDateSetListener(){
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
//日期改变设置事件处理
}
};
⑤ TimePickerDialog 的定义与初始化以及显示
// 定义程序用到的UI元素对象:时间设置器对话框
TimePickerDialog my_timePickerDialog;
//构造一个TimePickerDialog对象,第一个参数为Context、
//第二个参数为时间修改事件监听器、后面两个为初始化时间,
//最后一个boolean类型设置是否为24小时制
my_timePickerDialog=new TimePickerDialog(Ex_Ctrl_15_B.this,
myTimeSetListener, my_Hour, my_Minute, false);
//显示出日期设置对话框
my_timePickerDialog.show();
⑥ TimePickerDialog 的时间修改事件处理
//时间改变设置事件监听器
private OnTimeSetListener myTimeSetListener=new OnTimeSetListener(){
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// TODO Auto-generated method stub
//时间改变设置事件处理
}
};
⑦ 修改mainActivity.java,实现动态显示修改的日期、时间
......
⑧ 结果