package com.token.view.components;
public class KeyID {
public static final byte KEY_EDIT = -5; // 選擇鍵
public static final byte SOFT_LEFT = -6; // 左軟鍵
public static final byte SOFT_RIGHT = -7; // 右軟鍵
private KeyID() {}
}
package com.token.view.components;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class Menu {
private String leftOption;
private String rightOption;
private String cancelOption = "取消";
private String okOption = "確定";
private String[] menuOptions;
private int padding;
private Font ft;
private int width;
private int height;
public int menuHeight;
public Menu(GameCanvas canvas) {
width = canvas.getWidth();
height = canvas.getHeight();
}
public Menu(GameCanvas canvas, String leftOption, String rightOption, String[] menuOptions) {
this.leftOption = leftOption;
this.rightOption = rightOption;
this.menuOptions = menuOptions;
width = canvas.getWidth();
height = canvas.getHeight();
}
// 繪製軟鍵選項
public void drawMenu(GameCanvas canvas, Graphics graphics, String leftOption, String rightOption) {
width = canvas.getWidth();
height = canvas.getHeight();
padding = 5;
ft = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE);
int fontHeight = ft.getHeight();
menuHeight = fontHeight + 2 * padding;
graphics.setColor(Color.cmdSelectTop);
graphics.fillRect(0, height - menuHeight, width, menuHeight / 2 + 1);
graphics.setColor(Color.cmdSelectBottom);
graphics.fillRect(0, height - menuHeight / 2, width, menuHeight / 2);
graphics.setFont(ft);
graphics.setColor(Color.label);
if (leftOption != null) {
graphics.drawString(leftOption, padding, height - padding, Graphics.LEFT | Graphics.BOTTOM);
}
if (rightOption != null) {
graphics.drawString(rightOption, width - padding, height - padding, Graphics.RIGHT | Graphics.BOTTOM);
}
}
public void drawSubMenu(Graphics graphics, int selectedOptionIndex) {
padding = 6;
ft = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
int fontHeight = ft.getHeight();
int submenuMaxWidth = 0;
int submenuMaxHeight = 0;
int currentWidth = 0;
for (int i = 0; i < menuOptions.length; i++) {
currentWidth = ft.stringWidth(menuOptions[i]);
if (currentWidth > submenuMaxWidth) submenuMaxWidth = currentWidth;
submenuMaxHeight += fontHeight + padding;
}
submenuMaxWidth += 6 * padding;
int sub_padding = 3;
int sub_margin_left = 2;
int sub_margin_bottom = 2;
int submenuFrameMaxWidth = submenuMaxWidth + 2 * sub_padding;
int submenuFrameMaxHeight = submenuMaxHeight + 2 * sub_padding;
graphics.setColor(Color.menuFrame);
graphics.drawRoundRect(sub_margin_left,
height - menuHeight - submenuFrameMaxHeight - sub_margin_bottom,
submenuFrameMaxWidth, submenuFrameMaxHeight, 5, 5);
graphics.setColor(Color.menuBg);
graphics.fillRoundRect(sub_margin_left + 1,
height - menuHeight - submenuFrameMaxHeight - sub_margin_bottom + 1,
submenuFrameMaxWidth - 1, submenuFrameMaxHeight - 1, 5, 5);
graphics.setFont(ft);
int menuOptionX = sub_margin_left + sub_padding + padding;
int menuOptionY = height - menuHeight - submenuMaxHeight - sub_margin_bottom - sub_padding + padding / 2;
for (int i = 0; i < menuOptions.length; i++) {
if (i != selectedOptionIndex) {
graphics.setColor(Color.text);
graphics.drawString(menuOptions[i], menuOptionX, menuOptionY, Graphics.LEFT | Graphics.TOP);
} else {
graphics.setColor(Color.selectBg);
int highOptionY = height - menuHeight - sub_margin_bottom - submenuMaxHeight + i * (fontHeight + padding) - sub_padding;
graphics.fillRect(sub_margin_left + sub_padding, highOptionY, submenuMaxWidth + 1, fontHeight + padding);
graphics.setColor(Color.selectText);
graphics.drawString(menuOptions[i], menuOptionX, menuOptionY, Graphics.LEFT | Graphics.TOP);
}
menuOptionY += padding + fontHeight;
}
}
public void drawInactiveMenu(GameCanvas canvas, Graphics graphics) {
drawMenu(canvas, graphics, leftOption, rightOption);
canvas.flushGraphics();
}
public void drawActiveMenu(GameCanvas canvas, Graphics graphics, int selectedOptionIndex) {
drawMenu(canvas, graphics, cancelOption, okOption);
if (menuOptions != null) {
drawSubMenu(graphics, selectedOptionIndex);
canvas.flushGraphics();
}
}
}
package com.token.view;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import com.token.util.*;
import com.token.view.components.*;
public class MainScreen extends GameCanvas {
private UIController controller;
private Font ft;
private int width;
private int height;
static final String[] menuOptions = { "1.查看", "2.更新", "3.用戶管理", "4.幫助", "5.換膚", "6.退出" };
static int menuIdx;
private int currentlySelectedIndex = 0;
private boolean menuIsActive = false;
private String leftOption;
private String rightOption;
private Graphics graphics;
private Menu menu;
public MainScreen(UIController control) {
super(false);
this.controller = control;
setFullScreenMode(true);
ft = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE);
width = getWidth();
height = getHeight();
graphics = getGraphics();
menuIdx = 0;
leftOption = "選項";
rightOption = "";
menu = new Menu(this, leftOption, rightOption, menuOptions);
}
public void show(Object[] args) {
draw();
}
private void draw() {
menu.drawInactiveMenu(this, graphics);
}
public void drawBase() { }
public void clearScreen() {
graphics.setColor(0xFFFFFF);
graphics.fillRect(0, 0, width, height);
flushGraphics();
}
protected void keyPressed(int keyCode) {
if (menuIsActive) {
if (keyCode == KeyID.SOFT_LEFT) {
drawBase();
menu.drawInactiveMenu(this, graphics);
menuIsActive = false;
}
switch (keyCode) {
case Canvas.KEY_NUM1: currentlySelectedIndex = 0; menu.drawActiveMenu(this, graphics, currentlySelectedIndex); break;
case Canvas.KEY_NUM2: currentlySelectedIndex = 1; menu.drawActiveMenu(this, graphics, currentlySelectedIndex); break;
case Canvas.KEY_NUM3: currentlySelectedIndex = 2; menu.drawActiveMenu(this, graphics, currentlySelectedIndex); break;
case Canvas.KEY_NUM4: currentlySelectedIndex = 3; menu.drawActiveMenu(this, graphics, currentlySelectedIndex); break;
case Canvas.KEY_NUM5: currentlySelectedIndex = 4; menu.drawActiveMenu(this, graphics, currentlySelectedIndex); break;
case Canvas.KEY_NUM6: currentlySelectedIndex = 5; menu.drawActiveMenu(this, graphics, currentlySelectedIndex); break;
case KeyID.SOFT_RIGHT: keyCode = Canvas.FIRE; break;
default: ;
}
keyCode = (keyCode != Canvas.FIRE) ? getGameAction(keyCode) : keyCode;
switch (keyCode) {
case Canvas.UP:
if (currentlySelectedIndex == 0) currentlySelectedIndex = menuOptions.length - 1;
else { currentlySelectedIndex--; if (currentlySelectedIndex < 0) currentlySelectedIndex = 0; }
menu.drawActiveMenu(this, graphics, currentlySelectedIndex);
break;
case Canvas.DOWN:
if (currentlySelectedIndex == menuOptions.length - 1) currentlySelectedIndex = 0;
else { currentlySelectedIndex++; if (currentlySelectedIndex >= menuOptions.length) currentlySelectedIndex = menuOptions.length - 1; }
menu.drawActiveMenu(this, graphics, currentlySelectedIndex);
break;
case Canvas.FIRE: {
drawBase();
graphics.setColor(0x000000);
menu.drawInactiveMenu(this, graphics);
menuIsActive = false;
switch (currentlySelectedIndex) {
case 0: /* controller.handleEvent(...); */ break;
case 1: /* controller.handleEvent(...); */ break;
case 2: /* controller.handleEvent(...); */ break;
case 3: /* controller.handleEvent(UIController.EventID.EVENT_SHOW_HELP, null); */ break;
case 4: break;
case 5: /* controller.handleEvent(UIController.EventID.EVENT_EXIT, null); */ break;
default: ;
}
break;
}
default: ;
}
} else {
if (keyCode == KeyID.SOFT_LEFT) {
menu.drawActiveMenu(this, graphics, currentlySelectedIndex);
menuIsActive = true;
} else if (keyCode == KeyID.SOFT_RIGHT) { }
}
}
}
* 關於 UIController,後續文章將給予解釋。