BlackBerryUI設計大全(三)

1.2MIDP低級UI

與高級UI相比,低級UI就自由很多,任何時候我們可以調用repaint()產生重繪事件,調用完了repaint()會立刻返回,調用paint()回調函數則是由另一個專門的線程來完成。

相對於高級UI提供的豐富的組件,低級UI能夠對

我們從javax.microedition.lcdui.Canvas開始瞭解我們的低級UI,我們要用到低級UI必須要繼承Canvas這個抽象類,在 Canvas的核心是paint()這個方法,這個方法做是負責繪製屏幕上的畫面,每當屏幕需要重新繪製時,就會產生重繪事件時,系統就會自動調用paint(),並傳入一個Graphics對象。

任何時候我們都可以通過調用reapaint()方法來產生重繪事件,它有兩個方法,一個需要四個參數,分別用來指示起始座標(X,Y,長寬,另一個則不需要任何參數,代表整個畫面重新繪製。

我們可以通過getWidth()getHeight() 方法獲得Canvas的當前範圍大小。每當Canvas 範圍大小發生變化時,就會自動調用Canvas類的 sizeChanged()方法。

下面是通用的用低級CANVAS API繪製九宮格程序的源碼:

public class MenuCanvas extends Canvas implements CommandListener {

        private String[] menuName = new String[] { "login", "picture", "wap",

                       "phone", "call", "goto", "fuck", "music", "video" };

        private int canvaWidth = -1, canvaHeight = -1;

        private int maxHeight = -1, imgWidth = -1, imgHeight = -1;

        private int focus = 0;

        private int fontHeight = -1;

        private Image menuImg[] = new Image[9];

        private Command exit;

 

        public MenuCanvas() {

               exit = new Command("Exit", Command.EXIT, 1);

               addCommand(exit);

               setCommandListener(this);

               canvaWidth = getWidth();

               canvaHeight = getHeight();

               try {

                       for (int i = 0; i < menuImg.length; i++) {

                               menuImg[i] = Image.createImage(28, 28);

                               Graphics g = menuImg[i].getGraphics();

                               g.translate(-28 * i, 0);

                       }

               } catch (Exception e) {

                       System.out.println(e.toString());

               }

               imgWidth = menuImg[0].getWidth();

               imgHeight = menuImg[0].getHeight();

               fontHeight = Font.getDefaultFont().getHeight();

               maxHeight = imgHeight + fontHeight;

        }

 

        public void paint(Graphics g) {

               int color = g.getColor();

               g.setColor(0xFFFFFF);

               g.fillRect(0, 0, canvaWidth, canvaHeight);

               int cellWidth = canvaWidth / 3;

               int cellHeight = canvaHeight / 3;

               g.setColor(color);

               for (int i = 0; i < menuImg.length; i++) {

               g.drawImage(menuImg[i], cellWidth * (i % 3)

               + (cellWidth - imgWidth) / 2, cellHeight * (i / 3)

               + (cellHeight - maxHeight) / 2, Graphics.TOP

               | Graphics.LEFT);

               int fontWidth = Font.getDefaultFont().stringWidth(menuName[i]);

               g.drawString(menuName[i], cellWidth * (i % 3)

               + (cellWidth - fontWidth) / 2, cellHeight * (i / 3)

               + (cellHeight - maxHeight) / 2 + imgHeight + 1,

               Graphics.TOP | Graphics.LEFT);

               if (i == focus) {

               g.drawRect(cellWidth * (i % 3) + (cellWidth - imgWidth) / 2,

               cellHeight * (i / 3) + (cellHeight - maxHeight) / 2,

               imgWidth + 1, imgHeight + 1);

                       }

               }

        }

 

        public void keyPressed(int key) {

               int action = getKeyAction(key);

               switch (action) {

               case FIRE:

                       Alert alert = new Alert("You select:", menuName[focus],

                                      menuImg[focus], AlertType.INFO);

                       alert.setTimeout(Alert.FOREVER);

                       break;

               case UP:

                       focus = focus - 3;

                       if (focus < 0) {

                               focus = focus + 9;

                       }

                       break;

                ……

               repaint();

               serviceRepaints();

        }

 

        public void commandAction(Command c, Displayable dpa) {

               if (c == exit) {

               }

        }

}

最後得到的效果圖如下所示

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章