首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

Java ME 開發:低級界面繪圖之選單(二)

     編輯:J2ME

KeyID.java

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() {}
}

Menu.java

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();
        }
    }
}

MainScreen.java(節錄,僅供學習交流)

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,後續文章將給予解釋。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved