最近发现很多朋友在设计j2me程序的时候,在有些关键的UI设计都放弃j2me提供的高级UI。而自己通过继承Canvas,而实现自己想要的效果。游戏的菜单设计一般都是这样。设计自己的UI是比较困难的,因为自己要控制屏幕的各个元素跟各个元素的低级事件。我想这些不是问题。主要还是很少有教程手把手的教你。小第我经过一个项目,而起这个项目的UI全部是自己实现。所以在这方面算是有点点经验。所以拿出来给大家分享下。
我的设计思想是这样的。
1。手机CPU,内存等资源都有限。手机屏幕各个厂商各不相同。
2。手机基本不用考虑,窗口移动,拖动,缩放,重叠,窗口至顶等问题。
3。手机窗口事件不用考虑,拖动,移动,缩放,鼠标等时间。因此问题就相对简单了。
4:我们只需要实现,UI的显示跟文字,图片的排版显示,已经文字的滚动显示等。
下面将是一些片段代码,希望。
首先设计两个核心的类。
1。Part -- 窗口显示部件。主要是一些可以组装的组件例如(TextField,TextBox)等
[code]
public abstract class Part {
protected final int X = 0;
protected final int Y = 1;
protected final int WIDTH = 2;
protected final int HEIGHT = 3;
/**
* 位置的显示位置(相对手机屏幕的位置)
*/
protected int view[] = new int[4];
/**
* 背景色
*/
protected int bgColor = 0x000000;
/**
* 字体颜色
*/
protected int fontColor = 0xFFFFFF;
protected int selectIndex;
protected Canvas container;
protected String label;
/** 每个Item都有自己的焦点 **/
protected boolean hasFocus;
protected PartChangeListener partChangeListener;
public Part(int x, int y, int widht, int height) {
view[X] = x;
view[Y] = y;
view[WIDTH] = widht;
view[HEIGHT] = height;
}
public void setStyle(int bgColor, int fontColor) {
this.bgColor = bgColor;
this.fontColor = fontColor;
}
/**
* 默认字体
*/
protected Font font = Font.getDefaultFont();
/**
* 资料实现绘制方法
*
* @param g
*/
public abstract void paint(Graphics g);
/**
* 事件
*
* @param keyCode
*/
public abstract void onClick(int keyCode);
public int getSelectIndex() {
return selectIndex;
}
public void setSelectIndex(int selectIndex) {
this.selectIndex = selectIndex;
}
/**
* 改变部件的位置
*/
public void changePosition(int x, int y, int width, int height){
view[X] = x;
view[Y] = y;
view[WIDTH] = width;
view[HEIGHT] = height;
}
public void setContainer(Canvas container) {
this.container = container;
}
/**
* 聚焦,主要用户当前使用的Part。
* @param hasFocus
*/
public void setHasFocus(boolean hasFocus){
this.hasFocus = hasFocus;
}
public void setPartChangeListener(PartChangeListener partChangeListener) {
this.partChangeListener = partChangeListener;
}
public int[] getView() {
return view;
}[/code]
上面的类不足以显示,主要是通过下面的类,通过addPart方法添加进去。
[code]
public abstract class Panel extends Canvas {
private static Log log = Log.getLog("Panel");
final int X = 0;
final int Y = 1;
final int WIDTH = 2;
final int HEIGHT = 3;
/** 显示主要部分.比如菜单的Icon,List的数据的位置 */
int[] viewContent = new int[4];
Image icon;
Part part;
SoftButton softButton;
Part timer;
public Panel(){
init();
}
public Panel(Image icon) {
init();
this.icon = icon;
//此方法是让所以的Panel都添加一个TimerPart
//以后重构的时候应该�?�虑要不要这么做
//this.setTimer(null);
}
private void init() {
setFullScreenMode(true);
initViewContent();
this.softButton = new SoftButton();
}
public void addCommand(Command cmd) {
if (cmd == null)
return;
softButton.addCommand(cmd);
}
public Part getPart() {
return part;
}
public void append(Part part){
this.part = part;
}
public void setPartChangeListener(PartChangeListener partChangeListener) {
this.part.setPartChangeListener(partChangeListener);
}
public void removeCommand(int type) {
softButton.removeCommand(type);
}
public void setSoftButtonListener(CommandListener cmdListener) {
if (softButton != null)
softButton.setCommandListener(cmdListener);
}
public void setSoftButtonStyle(int bgColor, int fontColor){
this.softButton.setStyle(bgColor, fontColor);
}
public abstract void paint(Graphics g);
protected abstract void keyPressed(int keyCode);
/**
* 长按事件
*/
protected void keyRepeated(int keyCode) {
keyPressed(keyCode);
}
private void initViewContent() {
viewContent[X] = 0;
viewContent[Y] = 45;
viewContent[WIDTH] = Platform.WIDTH;
viewContent[HEIGHT] = Platform.HEIGHT;
}
public SoftButton getSoftButton() {
return softButton;
}
public void setSoftButton(SoftButton softButton) {
this.softButton = softButton;
}
/**
* 增加时间显示
*/
public void setTimer(Part timer){
this.timer = timer;
}
void paintTimerImpl(Graphics g){
if(timer != null)
timer.paint(g);
}
public void repaintTimer(){
if(timer != null){
int [] view = timer.getView();
repaint(view[X],view[Y],view[WIDTH], view[HEIGHT] );
}
}
}
[/code]
以上就是UI的核心,以后我将会逐渐介绍其他的组件跟相关的事件接口。读者也可以自己实现一些有意思的界面然后测试下,我相信效果会更好