J2ME與Android系統的常用類、方法對比
J2ME與Android系統的常用類、方法對比 |
|
J2ME系統 |
Android系統 |
入口程序 |
MIDlet類 |
Activity類 |
圖片類 |
Image類
Image.createImage(path); |
BitMap類
BitmapFactory.decodeResource(getResources(),R.drawable.map0); |
畫筆 |
Graphics類 |
Canvas類 |
繪畫 |
Displayable類 |
View類 |
按鍵 |
keyPressed()
keyRepeated()
keyReleased() |
onKeyDown()
onKeyUp()
onTracKballEvent() |
觸筆 |
pointerPressed(),
pointerReleased(),
pointerDragged() |
onTouchEvent() |
打印信息 |
System.out.printlt() |
Log類 |
生命周期-開始 |
startApp(),活動狀態,啟動時調用,初始化。 |
onCreate(),返回時也會調用此方法。
onCreate()后調用onStart(),
onStart()后調用onResume(), |
生命周期-暫停 |
PauseApp(),暫停狀態,如來電時,調用該接口。 |
onPause() |
生命周期-銷毀 |
destroyApp(),銷毀狀態,退出時調用。 |
onStop(),程序不可見時調用onDestroy(),程序銷毀時調用 |
刷新 |
高級UI組件由內部刷新實現。
低級UI,canvas中通過調用線程結合repaint()來刷新,讓線程不斷循環 |
高級UIHandler類通過消息的機制刷新
onDraw()刷新接口
低級UI開發者用線程控制更新,在lockCanvas()和unlockCanvasAndPost()方法之間繪制 |
數據存儲 |
Record Management System (RMS) |
SQLite數據庫
SharedPreferences類 |
可繪區域 |
int clipX = g.getClipX();
int clipY = g.getClipY();
int clipW = g.getClipWidth();
int clipH = g.getClipHeight();
g.clipRect(x, y, width, height);
g.setClip(clipX, clipY, clipW, clipH); |
canvas.save();
canvas.clipRect(x,y,x+width, y+height);
cavnas.resave(); |
游戲中清屏 |
paint.setStyle(Style.FILL);
canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint); |
canvas.drawColor(Color.BLACK); |
游戲開發包 |
javax.microedition.lcdui.game包
GameCanvas類
Layer類
LayerManager類
Sprite類
TiledLayer類 |
無專門針對游戲的開發包,可以直接拿來主義,將J2ME的開發包稍作修改 |
音效 |
Player s =Manager.createPlayer(InputStream);
s.prepare(); //創建
s.start();//播放
s.stop();//暫停
s.stop();//關閉
s.release();//釋放 |
MediaPlayer類處理背景音樂
SoundPool類處理一些簡單的音效 |
全屏 |
Canvas中SetFullScreenMode() |
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE); |
獲得屏幕尺寸 |
Canvas類的getHeight()和getWidth() |
Display d = getWindowManager().getDefaultDisplay();
screenWidth = d.getWidth();
screenHeight = d.getHeight(); |
雙緩沖 |
Image bufImage=Image.createImage(bufWidth, bufHeight);
Graphics bufGraphics=bufImage.getGraphics(); |
Bitmap carBuffer = Bitmap.createBitmap(bufWidth, bufHeight, Bitmap.Config.ARGB_4444);
Canvas carGp = new Canvas(carBuffer); |
|
|
|
|
三 開始移植
小白找到Android中對應的J2ME相關的替代類和替代方法后,開始噼里啪啦的改代碼了。沒過多久,首個俄羅斯方塊算是移植成功。當他開始移植下一款游戲時,發現又要重復的改那些代碼……
“可不可以減少代碼的改動呢?”小白問自己。“可否用Android的相關代碼構造一些和J2me里功能類似的代碼呢?”
原則:盡量少改動J2ME項目的代碼。用Android中對應的類改寫成J2ME中的方法和類,減少以后移植的工作量,甚至實現無縫移植。
“或許我可以構造一個名為MIDlet實為Activity的類,這樣J2me中的入口類就不用改動了”
用Activity類改裝的MIDlet類:
public abstract class MIDlet extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startApp();
}
public abstract void destroyApp(boolean unconditional);
public String getAppProperty(String key) {
return null;
}
public abstract void startApp();
public void notifyDestroyed() {
}
public void notifyPaused() {}
public void pauseApp() {}
public void platformRequest(String URL) {}
public void resumeRequest() {}
}
MIDlet類我們解決了,接下來就是非常重要的Canvas類了。
J2me里的Canvas類相當于Android體系中的SurfaceView類,都是負責繪制顯示界面的,游戲的大循環一半也在這兩個類里實現,也就是都會實現Runnable類,更新邏輯和更新界面都在此類的大循環中處理。
Graphics類在J2me里負責繪圖和排版樣式等。
我們可以用Android里的Canvas類和Paint類共同組合一個Android里的Graphics類,如Graphics類的構造函數可這樣定義:
public Graphics(Bitmap bitmap) {
this.bitmap = bitmap;
this.canvas = new Canvas(bitmap);
this.canvas.clipRect(0, 0, bitmap.getWidth(), bitmap.getHeight());
this.canvas.save(Canvas.CLIP_SAVE_FLAG);
this.paint = new Paint();
this.clip = canvas.getClipBounds();
}
Graphics里可以設置居中方式,在Android體系里我們用Paint類來實現相同的效果,例如:
public void setAlign(int align)
{
if(LEFT == align
||(Graphics.LEFT | Graphics.TOP) == align
||(Graphics.LEFT | Graphics.BOTTOM) == align)
{
paint.setTextAlign(Align.LEFT);
}else if(HCENTER == align
||(Graphics.HCENTER|Graphics.TOP) == align)
{
paint.setTextAlign(Align.CENTER);
}else if(RIGHT == align
||(Graphics.RIGHT | Graphics.TOP) == align)
{
paint.setTextAlign(Align.RIGHT);
}
}
所有的繪制方法也同樣沿用J2me中的方法名,用Android體系的代碼完成方法體,達到無縫移植。以繪制、填充矩形為例:
public void fillArc(int x,int y,int width,int height, int startAngle,int arcAngle) {