J2ME與Android系統(tǒng)的常用類、方法對比
J2ME與Android系統(tǒng)的常用類、方法對比
J2ME與Android系統(tǒng)的常用類、方法對比 | ||
|
J2ME系統(tǒng) |
Android系統(tǒng) |
入口程序 |
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(),活動(dòng)狀態(tài),啟動(dòng)時(shí)調(diào)用,初始化。 |
onCreate(),返回時(shí)也會(huì)調(diào)用此方法。 onCreate()后調(diào)用onStart(), onStart()后調(diào)用onResume(), |
生命周期-暫停 |
PauseApp(),暫停狀態(tài),如來電時(shí),調(diào)用該接口。 |
onPause() |
生命周期-銷毀 |
destroyApp(),銷毀狀態(tài),退出時(shí)調(diào)用。 |
onStop(),程序不可見時(shí)調(diào)用onDestroy(),程序銷毀時(shí)調(diào)用 |
刷新 |
高級UI組件由內(nèi)部刷新實(shí)現(xiàn)。 低級UI,canvas中通過調(diào)用線程結(jié)合repaint()來刷新,讓線程不斷循環(huán) |
高級UIHandler類通過消息的機(jī)制刷新 onDraw()刷新接口 低級UI開發(fā)者用線程控制更新,在lockCanvas()和unlockCanvasAndPost()方法之間繪制 |
數(shù)據(jù)存儲(chǔ) |
Record Management System (RMS) |
SQLite數(shù)據(jù)庫 SharedPreferences類 |
可繪區(qū)域 |
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); |
游戲開發(fā)包 |
javax.microedition.lcdui.game包 GameCanvas類 Layer類 LayerManager類 Sprite類 TiledLayer類 |
無專門針對游戲的開發(fā)包,可以直接拿來主義,將J2ME的開發(fā)包稍作修改 |
音效 |
Player s =Manager.createPlayer(InputStream); s.prepare(); //創(chuàng)建 s.start();//播放 s.stop();//暫停 s.stop();//關(guān)閉 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中對應(yīng)的J2ME相關(guān)的替代類和替代方法后,開始噼里啪啦的改代碼了。沒過多久,首個(gè)俄羅斯方塊算是移植成功。當(dāng)他開始移植下一款游戲時(shí),發(fā)現(xiàn)又要重復(fù)的改那些代碼……
“可不可以減少代碼的改動(dòng)呢?”小白問自己。“可否用Android的相關(guān)代碼構(gòu)造一些和J2me里功能類似的代碼呢?”
原則:盡量少改動(dòng)J2ME項(xiàng)目的代碼。用Android中對應(yīng)的類改寫成J2ME中的方法和類,減少以后移植的工作量,甚至實(shí)現(xiàn)無縫移植。
“或許我可以構(gòu)造一個(gè)名為MIDlet實(shí)為Activity的類,這樣J2me中的入口類就不用改動(dòng)了”
用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類相當(dāng)于Android體系中的SurfaceView類,都是負(fù)責(zé)繪制顯示界面的,游戲的大循環(huán)一半也在這兩個(gè)類里實(shí)現(xiàn),也就是都會(huì)實(shí)現(xiàn)Runnable類,更新邏輯和更新界面都在此類的大循環(huán)中處理。
Graphics類在J2me里負(fù)責(zé)繪圖和排版樣式等。
我們可以用Android里的Canvas類和Paint類共同組合一個(gè)Android里的Graphics類,如Graphics類的構(gòu)造函數(shù)可這樣定義:
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里可以設(shè)置居中方式,在Android體系里我們用Paint類來實(shí)現(xiàn)相同的效果,例如:
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體系的代碼完成方法體,達(dá)到無縫移植。以繪制、填充矩形為例:
public void fillArc(int x,int y,int width,int height, int startAngle,int arcAngle) {
posted on 2011-11-07 21:37 江天部落格 閱讀(885) 評論(0) 編輯 收藏 所屬分類: Android