Java 桌面(Swing/AWT)與 Android 遊戲移植的最大障礙是繪圖機制完全不同:
java.awt.Graphics / Graphics2D,配合 paintComponent(Graphics g) 回調android.graphics.Canvas,配合 onDraw(Canvas canvas) 或 SurfaceView / TextureView 主動繪製| 功能 | Java (Swing) | Android |
|---|---|---|
| 繪圖物件 | Graphics2D g | Canvas canvas |
| 繪製圖片 | g.drawImage(img, x, y, null) | canvas.drawBitmap(bmp, x, y, paint) |
| 繪製文字 | g.drawString(str, x, y) | canvas.drawText(str, x, y, paint) |
| 顏色/樣式 | g.setColor(c) | paint.setColor(c) + Paint 物件 |
| 觸發重繪 | repaint() | invalidate() / postInvalidate() |
| 遊戲迴圈 | Timer / 執行緒 + sleep | SurfaceView + 專用繪製執行緒 / Choreographer |
interface Renderer {
void drawImage(Image img, float x, float y);
void drawText(String text, float x, float y);
// ...
}
Java2DRenderer 給桌面,CanvasRenderer 給 AndroidInputEvent若專案較大,建議直接使用 LibGDX:
SpriteBatch、Texture、InputProcessor 等// 共用邏輯
class GameEngine {
void update(float delta) { /* 物理、AI、狀態 */ }
void render(Renderer r) { /* 呼叫 r.draw*() */ }
}
// Android 實作
class GameView extends SurfaceView implements Runnable, Renderer {
Canvas canvas;
Paint paint = new Paint();
// 實作 Renderer 介面方法...
@Override public void drawImage(Image img, float x, float y) {
canvas.drawBitmap(((AndroidImage)img).bmp, x, y, paint);
}
// 遊戲迴圈在 run() 中:lockCanvas → engine.render(this) → unlockCanvasAndPost
}
Java 到 Android 遊戲移植核心是「Paint 換 Canvas」,但架構分離才是長久之計。小專案可手動抽象渲染層;中大型專案強烈建議遷移至 LibGDX 等成熟跨平台框架,避免重複造輪子並獲得效能優化。