昨天主管叫我做個菜單,我把題意理解錯瞭,也可以說是沒問清楚吧
開始做瞭個command的菜單,後來他說要用canvas畫,又做瞭一個非常難看的,被打瞭回來,看瞭別的軟件的菜單樣式,重新寫瞭一個
1.command菜單
菜單代碼如下:
package karant.zhan;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class MenuDemo extends MIDlet implements CommandListener{
Display display;
Form form;
Alert alert;
private Command backCommand = new Command("Back", Command.BACK, 1);
private Command exitCommand = new Command("Exit", Command.EXIT, 60);
private Command ebestCommand = new Command("Ebest", Command.SCREEN, 22);
private Command jordanCommand = new Command("Jordan", Command.OK, 23);
private Command whutCommand = new Command("Whut", Command.SCREEN, 24);
private Command y33Command = new Command("ye33", Command.SCREEN, 25);
public MenuDemo() {
display = Display.getDisplay(this);
Form form = new Form("Menu Test");
form.addCommand(exitCommand);
form.addCommand(ebestCommand);
form.addCommand(backCommand);
form.addCommand(jordanCommand);
form.addCommand(whutCommand);
form.addCommand(y33Command);
form.setCommandListener(this);
alert = new Alert("");
display.setCurrent(form);
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
}
public void commandAction(Command c, Displayable d) {
if(c == ebestCommand)
{
alert.setString(" Hello Ebest");
display.setCurrent(alert);
}
else if(c == whutCommand)
{
alert.setString(" Hello Whut");
display.setCurrent(alert);
}
else if(c == y33Command)
{
alert.setString(" Love y33");
display.setCurrent(alert);
}
else if(c == jordanCommand)
{
alert.setString(" My Ido Jordan");
display.setCurrent(alert);
}
else if(c == exitCommand)
{
try {
destroyApp(false);
} catch (MIDletStateChangeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
notifyDestroyed();
}
}
}
上傳圖片不能用
2.下面是用canvas畫的,焦點效果要好點
MIDlet類代碼如下:
package karant.zhan;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class DrawMenuMIDlet extends MIDlet {
MenuAction menuAction;
Display display;
public DrawMenuMIDlet() {
display = Display.getDisplay(this);
menuAction = new MenuAction(this);
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
}
下面是繪制菜單的類MenuCanvas
package karant.zhan;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
public class MenuCanvas {
private String leftOption;
private String rightOption;
private String backOption = "返回";
private String[] menuOptions;
private int padding = 5; //邊框與屏幕距離
//顏色設置
private static final int defaulFontColor = 0x000000; //默認字體顏色
private static final int selectedFontColor = 0XB0171F; //選中後字體顏色
private static final int bgColor = 0xfec6e9; // 菜單背景顏色
private static final int heighLight = 0xDA70D6; //選中的菜單高亮顯示顏色
//構造函數 初始化
public MenuCanvas(String leftOption, String rightOption,
String[] menuOptions) {
this.leftOption = leftOption;
this.rightOption = rightOption;
this.menuOptions = menuOptions;
}
//繪制默認顯示的狀態
public void drawInactiveMenu(GameCanvas canvas, Graphics g){
Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM); //獲得字體
int fontHeignt = font.getHeight();
int width = canvas.getWidth();
int height = canvas.getHeight();
g.setColor(bgColor); //設置背景
g.fillRoundRect(0, height – fontHeignt – 2*padding, width, height, 10, 10); //繪制初始左右菜單位置矩形框
g.setFont(font); //設置字體
g.setColor(defaulFontColor); //設置為默認字體顏色
g.drawString(leftOption , padding, height – padding, g.LEFT|g.BOTTOM); //繪制左按鈕
g.drawString(rightOption, width-padding, height – padding, g.RIGHT|g.BOTTOM); //繪制右按鈕
canvas.flushGraphics(); //將設置好的東西重新刷屏顯示
}
//繪制選擇菜單時的狀態
public void drawActiveMenu(GameCanvas canvas, Graphics g, int select){
Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM); //設置字體
int fontHeight = font.getHeight(); //字體高度
int width = canvas.getWidth(); //屏幕寬
int height = canvas.getHeight(); //屏幕高
g.setColor(bgColor); //設置菜單背景顏色
g.fillRoundRect(0, height – fontHeight – 2*padding, width, height, 10, 10); //畫菜單選項的圓角矩形
//繪制默認的左右選項
g.setFont(font);
g.setColor(defaulFontColor);
g.drawString(leftOption, padding, height – padding, g.LEFT | g.BOTTOM);
// draw "Cancel" option
g.drawString(backOption, width – padding, height – padding, g.RIGHT
| g.BOTTOM);
canvas.flushGraphics(); //設置好後刷屏繪制出來
if(menuOptions != null){ //存儲菜單選項的數組不為空時
int menuMaxWidth = 0; //最大菜單寬度
int menuMaxHeight = 0; //最大菜單高度
int currentWidth = 0; //目前寬度
//用來選出菜單選項最大子菜單的寬度
for(int i = 0 ; i < menuOptions.length;i++){
currentWidth = font.stringWidth(menuOptions[i]);
if(currentWidth > menuMaxWidth)
menuMaxWidth = currentWidth;
menuMaxHeight += fontHeight + padding; //菜單的高度,沒加一個菜單選項相應的加一個字體高度和距離
}
menuMaxWidth +=6*padding; //設置寬度加上6個間距
g.setColor(bgColor);
g.fillRoundRect(0, //x
height – fontHeight -menuMaxHeight -2*padding,//y
menuMaxWidth, menuMaxHeight, 10, 10); //繪制圓角彈出框
g.setFont(font);
int menuOptionX = 3*padding; //菜單選項的初始橫坐標
int menuOptionY = height – fontHeight – 2*padding -menuMaxHeight + padding; //菜單選項的初始縱坐標
//為每個菜單添加一條線的循環
for(int i=0; i <= menuOptions.length ; i++)
{
g.setColor(heighLight); //被選中的選框顏色
int lineOptionY = height – fontHeight – 2*padding -menuMaxHeight + i*(fontHeight + padding); //在菜單之間加一條線
g.drawLine(0, lineOptionY, menuMaxWidth -1,lineOptionY );
}
//畫菜單項的循環
for(int i = 0; i < menuOptions.length; i++){
if(i != select){ //如果沒被選中,則為默認顯示
g.setColor(defaulFontColor);
g.drawString(menuOptions[i], menuOptionX , menuOptionY , g.LEFT|g.TOP);
}
else{ //菜單被選中時的顏色顯示
g.setColor(heighLight); //選中時的顏色
int heightY = height – fontHeight – 2*padding – menuMaxHeight + i*(fontHeight + padding); //
g.fillRoundRect(0, heightY, menuMaxWidth, fontHeight + padding, 10, 10);
g.setColor(selectedFontColor);
g.drawString(menuOptions[i], menuOptionX, menuOptionY, g.LEFT
| g.TOP);
}
menuOptionY += padding + fontHeight; //畫完一個菜單之後坐標下移
}
canvas.flushGraphics(); //將設置的信息全部顯示到屏幕
}
}
}
下面是控制桌面顯示繪圖的類
MenuAction類
package karant.zhan;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.midlet.MIDletStateChangeException;
public class MenuAction extends GameCanvas{
static int width; //屏幕寬
static int height; //屏幕高
static final String[] menuOptions = {"狀態設置","聊天記錄","好友管理","系統設置","註銷","幫助","關於"}; //菜單選項
static int menuChoose; //用於記錄按下確定鍵的菜單位置
private int select = 0; //當前選中的按鍵的索引值
private boolean menuIsActive = false; //手機是否處在菜單選著狀態中,初始化為否
private DrawMenuMIDlet menumidlet; //MIDlet對象
private String leftOption;
private String rightOption;
private Graphics g;
private MenuCanvas menu;
private int LEFT_KEY = -6; //手機左功能鍵
private int RIGHT_KEY = -7; //手機右功能鍵
public MenuAction(DrawMenuMIDlet menumidlet) {
super(false);
this.menumidlet = menumidlet;
//獲取屏幕的寬高
width = getWidth();
height = getHeight();
setFullScreenMode(true); //設置全屏
menuChoose = 0; //初始化
g = getGraphics(); //獲得畫筆
leftOption = "菜單"; //設置左邊顯示菜單
rightOption = "退出"; //設置右邊顯示退出
menu = new MenuCanvas(leftOption , rightOption, menuOptions); //初始化界面
start(); //初始化屏幕你內容
menumidlet.display.setCurrent(this);
}
public void start(){
clearScreen(); //清屏
menu.drawInactiveMenu(this,g); //菜單初始模版設置
}
public void clearScreen(){
g.setColor(0xedffff); //設置背景顏色
g.fillRect(0, 0, width, height); //填充屏幕
flushGraphics(); //刷新屏幕
}
protected void keyPressed(int keyCode){
if(menuIsActive){ //為真時當進入瞭菜單選項
if(keyCode == RIGHT_KEY){ //如果按瞭返回
clearScreen(); //清理屏幕
menu.drawInactiveMenu(this, g);
menuIsActive = false;
}
keyCode = getGameAction(keyCode);
if(keyCode == UP) // 按下向上鍵
{
select–;
if(select < 0)
select = 0;
menu.drawActiveMenu(this, g, select);
}
else if(keyCode == DOWN) //按下向下鍵
{
select++;
if(select > 6)
select = 6;
menu.drawActiveMenu(this, g, select); //重新繪制目錄選擇狀態
}
else if(keyCode == FIRE){ //按瞭確定鍵
clearScreen(); //清屏
g.setColor(0,0,0); //設置顯示顏色
g.drawString("你選擇瞭: " + menuOptions[select], 10, 15, g.LEFT|g.TOP);
menu.drawInactiveMenu(this, g); //返回初始界面
menuIsActive = false;
}
}
else{
if(keyCode == LEFT_KEY){ //當菜單鍵按下
menu.drawActiveMenu(this, g, select);
menuIsActive = true;
}
else if(keyCode == RIGHT_KEY){ //退出
try {
menumidlet.destroyApp(false);
} catch (MIDletStateChangeException e) {
e.printStackTrace();
}
menumidlet.notifyDestroyed();
}
}
}
}
上傳的照片不能用