TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
在这一篇中,我将向大家介绍图形用户界面中的低级图形用户界面。所谓低级图形用户界面,指的是那种我们可以自己在上面画图的控件,它是和TextBox,List等等这些用户控件刚好相对的概念,因为这些用户控件的形状是事先画好的,无需我们程序员操心,所以称为高级图形界面。低级图形用户界面什么东西都需要我们自己画,所以比较复杂,当然也更加灵活,只有想不到,没有画不出,所以我们先介绍它。
在J2ME开发中,低级图形用户界面是由javax.microedition.lcdui.Canvas类实现的,我们只要继承这个类,并实现这个类的paint方法,就可以随心所欲的进行绘画了。当然,绘画之前,我们少不了要了解我们的手机屏幕究竟有多大的画图空间,这可以通过调用Canvas类的getWidth和getHeight方法实现。
下面是一个简短的程序,向大家演示了怎么获画布的大小,同时,也算是一个小小的框架。首先,当然是创建我们自己的画布,代码如下:

package
com.xkland.j2me;


import
javax.microedition.lcdui.Canvas;

import
javax.microedition.lcdui.Graphics;

 
/** */
/**
*
* @author 海边沫沫
*/
 
public
class
MyCanvas
extends
Canvas

{
 /** *//** Creates a new instance of MyCanvas */
 public MyCanvas() {
}
 public void clearBackground(Graphics g) {
int color = g.getColor();
g.setColor(0xffffff);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(color);
}
 public void paint(Graphics g) {
//清除背景
clearBackground(g);
//显示可供绘图的区域的大小
g.drawString("宽度:",10,10,Graphics.LEFT|Graphics.TOP);
g.drawString(String.valueOf(getWidth()),50,10,Graphics.LEFT|Graphics.TOP);
g.drawString("高度:",10,25,Graphics.LEFT|Graphics.TOP);
g.drawString(String.valueOf(getHeight()),50,25,Graphics.LEFT|Graphics.TOP);
}
}
第二个类当然就是我们的Midlet了,因为它是主程序嘛。在程序启动的时候调用display.setCurrent将画布设置为主界面,同时设置事件监听器。代码比较简单,如下:

package
com.xkland.j2me;


import
javax.microedition.midlet.
*
;

import
javax.microedition.lcdui.
*
;

 
/** */
/**
*
* @author 海边沫沫
* @version
*/
 
public
class
CanvasTest
extends
MIDlet

{
private Canvas canvas = new MyCanvas();
private Display display = null;
private Command exitCommand = new Command("退出",Command.EXIT,1);
 public void startApp() {
 if(display==null) {
display = Display.getDisplay(this);
canvas.addCommand(exitCommand);
canvas.setCommandListener(new MyCommandListener(this,canvas));
display.setCurrent(canvas);
}
}
 public void pauseApp() {
}
 public void destroyApp(boolean unconditional) {
}
}
第三个类当然是我们的事件监听器类了,等一下我们会讲到,Canvas支持许多低级事件,比如键盘的按键事件,所以我们这里把事件监听器单独抽取出来,代码如下:

package
com.xkland.j2me;


import
javax.microedition.lcdui.CommandListener;

import
javax.microedition.lcdui.Command;

import
javax.microedition.lcdui.Displayable;

import
javax.microedition.lcdui.Canvas;

 
/** */
/**
*
* @author 海边沫沫
*/
 
public
class
MyCommandListener
implements
CommandListener

{
private CanvasTest app;
private Canvas canvas;
 /** *//** Creates a new instance of MyCommandListener */
 public MyCommandListener(CanvasTest app,Canvas canvas) {
this.app = app;
this.canvas = canvas;
}
 public void commandAction(Command cmd, Displayable displayable) {
 if(cmd.getLabel().equalsIgnoreCase("退出")) {
app.destroyApp(false);
app.notifyDestroyed();
}
}
}
下面是运行效果:

知道了画图区域的大小,同时又知道Canvas可以支持许多低级事件,我们就可以发挥我们自己的想象力创建一个小游戏了。下面,我将写一个简单的拼图游戏,只需要使用上下左右四个方向键操作即可,在事件监听器中,我们只需响应Canvas的keyPressed()事件即可。代码也不复杂,只需把上面的程序稍加扩展即可。当然,我们还需要准备一些图片当素材。
|
|