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

Java ME MIDP 低階 GUI API:Canvas 與 Graphics 繪圖詳解

     編輯:Java 程式設計入門

Canvas:空白繪圖畫布

繼承 Displayable,覆寫 paint(Graphics g) 實作自繪。範例:紅底白字 "Hello World!"。

public class MyCanvas extends Canvas {
  public void paint(Graphics g) {
    g.setColor(0xFF0000); // 紅
    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(0xFFFFFF); // 白
    g.drawString("Hello World!", 0, 0, Graphics.TOP | Graphics.LEFT);
  }
}

顯示:display.setCurrent(new MyCanvas())。

座標系統與繪圖模型

  • 原點 (0,0) 在左上角,X 向右增,Y 向下增。
  • 像素替換模式:當前顏色直接覆蓋目標像素。
  • 24-bit RGB 色彩模型,裝置不支援彩色時自動映射灰階。
  • 查詢裝置色彩:Display.isColor(), numColors()。

雙緩衝實現流暢動畫

  1. 建立離屏緩衝圖像:Image buffer = Image.createImage(getWidth(), getHeight());
  2. 取得緩衝 Graphics:Graphics gc = buffer.getGraphics();
  3. 在 gc 上繪圖 (動畫每幀)。
  4. paint(Graphics g) 中快速拷貝:g.drawImage(buffer, 0, 0, 0);
  5. 檢查 Canvas.isDoubleBuffered() 避免重複實作。

執行緒安全與重繪機制

  • MIDP GUI API 為執行緒安全,可從任何執行緒呼叫。
  • 例外:Canvas.serviceRepaints() 立即同步呼叫 paint(),**若 paint() 鎖定共享物件會死鎖**。避免在 paint() 同步共享物件。
  • Display.callSerially(Runnable):所有待處理重繪完成後,在事件執行緒執行 run(),適合更新 UI 狀態。

字體處理

  • 應用程式不可自建字體,透過 Font.getFont(face, style, size) 申請,系統回傳最接近字體。
  • 三屬性:字體 (MONOSPACE, PROPORTIONAL, SYSTEM)、大小 (SMALL, MEDIUM, LARGE)、風格 (BOLD, ITALIC, PLAIN, UNDERLINED)。風格可用 | 組合。
  • 查詢字體資訊:getFace(), getSize(), getStyle()。

繪製字體範例

public class FontCanvas extends Canvas {
  public void paint(Graphics g) {
    g.setColor(0xFFFFFF); g.fillRect(0,0,getWidth(),getHeight());
    g.setColor(0x000000);
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE));
    g.drawString("System Font", 0, 0, Graphics.LEFT | Graphics.TOP);
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM));
    g.drawString("Medium Size", 0, 15, Graphics.LEFT | Graphics.TOP);
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM));
    g.drawString("Bold Style", 0, 30, Graphics.LEFT | Graphics.TOP);
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_ITALIC, Font.SIZE_MEDIUM));
    g.drawString("Italic Style", 0, 45, Graphics.LEFT | Graphics.TOP);
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_UNDERLINED, Font.SIZE_MEDIUM));
    g.drawString("Underlined Style", 0, 60, Graphics.LEFT | Graphics.TOP);
  }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved