站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题看到一篇关于J2ME中的钟表的文章,想到了多年前的习作

看到一篇关于J2ME中的钟表的文章,想到了多年前的习作

摘要: 看到一篇关于J2ME中的钟表的文章,想到了多年前的习作
J2ME制作一个时钟


看到一篇文章想到了很久以前自己的一篇习作。

这个时钟程序的“钟盘”背景是通过加载一个背景图像文件来实现的,避免的用程序去画“钟盘”的繁琐
1. ClockCanvas.java文件
////////////////////////ClockCanvas.java/////////////////////////////////////
package ClockDemo;

import java.io.IOException;
import java.util.Calendar;
import java.util.TimeZone;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

public class ClockCanvas extends Canvas implements Runnable {
private Image source;
private Image copy;
private Calendar cal;
private int imageWidth, imageHeight;
private int screenWidth, screenHeight;
private int hourLength = 36, minuteLength = 50, secondLength = 58; //时,分,秒针的长度
private int hour = 0, minute = 0, second = 0; //当前时间
// private int hx, hy; //时针坐标


public ClockCanvas() {
try {
source = Image.createImage("/Clock.png");
copy = Image.createImage(this.getWidth(), this.getHeight());
Graphics g = copy.getGraphics();

imageWidth = source.getWidth();
imageHeight = source.getHeight();
screenWidth = this.getWidth();
screenHeight = this.getHeight();

cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8:00"));
g.drawImage(source, (screenWidth - imageWidth) / 2,
(screenHeight - imageHeight) / 2,
Graphics.LEFT | Graphics.TOP);

} catch (IOException e) {
e.printStackTrace();
}
Thread t = new Thread(this);
t.start();
}

protected void paint(Graphics gs) {
gs.drawImage(copy, 0, 0, Graphics.LEFT | Graphics.TOP);
gs.setColor(0, 0, 0);
gs.drawString(String.valueOf(Calendar.getInstance(TimeZone.getTimeZone("GMT+8:00")).get( Calendar.AM))=="0" ? "AM":"PM" +
Calendar.getInstance(TimeZone.getTimeZone("GMT+8:00")).get(Calendar.HOUR) + ":" +
Calendar.getInstance(TimeZone.getTimeZone ("GMT+8:00")).get(Calendar.MINUTE) + ":" +
Calendar.getInstance(TimeZone.getTimeZone("GMT+8:00")).get(Calendar.SECOND),
0, 0, Graphics.LEFT | Graphics.TOP);

second = (second + 1) % 60;

double secangle = Math.PI * second / 30;
int sx = screenWidth / 2 + (int) (secondLength * Math.sin(secangle));
int sy = screenHeight / 2 - (int) (secondLength * Math.cos(secangle));
//画秒针
gs.setColor (0x0000ffff);
gs.drawLine(sx, sy, screenWidth / 2, screenHeight / 2);

if (second % 60 == 0) {
minute = (minute + 1) % 60;
}

double minangle = Math.PI * minute / 30;
int mx = screenWidth / 2 + (int) (minuteLength * Math.sin(minangle));
int my = screenHeight / 2 - (int) (minuteLength * Math.cos(minangle));
//画分针
gs.setColor(0x0000ff00);
gs.drawLine(mx, my, screenWidth / 2, screenHeight / 2);

if (minute % 60 == 0) {
hour = (hour + 1) % 12;
}

double hourangle = Math.PI * hour / 6 + Math.PI * minute / 360;
int hx = screenWidth / 2 + (int) (hourLength * Math.sin(hourangle));
int hy = screenHeight / 2 - (int) (hourLength * Math.cos(hourangle));
//画时针
gs.setColor (0x00ff0000);
gs.drawLine(hx, hy, screenWidth / 2, screenHeight / 2);
}

public void run() {
hour = cal.get(Calendar.HOUR);
minute = cal.get(Calendar.MINUTE);
second = cal.get(Calendar.SECOND);
System.out.println(hour);

while (true) {
cal = Calendar.getInstance (TimeZone.getTimeZone("GMT+8:00"));
repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}



2. ClockDemo.java文件

package ClockDemo;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class ClockDemo extends MIDlet implements CommandListener {
private Command exitCommand;
private ClockCanvas cc;

public ClockDemo() {
exitCommand = new Command("Exit", Command.EXIT, 1);
cc = new ClockCanvas();
cc.addCommand(exitCommand);
cc.setCommandListener(this);
Display.getDisplay(this).setCurrent(cc);

}

protected void startApp() throws MIDletStateChangeException {

}

protected void pauseApp() {

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

}

public void commandAction(Command c, Displayable d) {
if (c == exitCommand) {
try {
destroyApp(false);
} catch (MIDletStateChangeException e) {
e.printStackTrace();
}
notifyDestroyed();
}
}

}


提示:
注意:为了实现浮点数,我们要设置工程为使用cldc API版本为1.1,因为代码中在计算弧度时使用了浮点数。
下面是我在天极的文章VB设计有语音报时和报警功能的闹钟》点击察看

其中对三角函数部分解释的很详细。可以作为本篇文章的参考。





↑返回目录
前一篇: 一步一步教你开发《松鼠推箱子》手机游戏
后一篇: CLDC API和MIDP API源代码下载地址(包含各个版本) [转贴]