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) {