昨天主管叫我做个菜单,我把题意理解错了,也可以说是没问清楚吧
开始做了个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();
}
}
}
}
上传的照片不能用