Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 759|回复: 0

【贪吃蛇】系列 3. 用J2ME实现Android的Snake Sample详解 - Android

[复制链接]

该用户从未签到

发表于 2011-10-27 08:12:20 | 显示全部楼层 |阅读模式
本次会详细讲解将Android的Snake Sample移植到J2ME上,从而比较二者的区别和联系。
在《1.AndroidSDKSample-Snake详解》中,我们已经详细介绍了Android实现的Snake项目结构,现在我们要将这个项目用J2ME实现。
一、J2ME vs. Android
Android的UI实用、方便,而且很美观,基本无需改动且定制方便。而J2ME的高级用户界面比较鸡肋,在现在大多数的应用里都看不到,多数稍微复杂点的界面都是手工画,或是用一些开源的高级UI库。接下来我们简单比较下二者的区别,为Snake项目从Android到J2ME的移植做准备。
1.平台
J2ME:
开发平台
Android:
操作系统
2.工程结构
J2ME:
res:资源文件
src:源代码
Android:
src:源代码
res\drawable:图片
res\raw:声音
res\values:字符串
assets:数据文件
3. 安装包
J2ME:
jad,jar
Android:
apk
4. 代码结构
J2ME:
MIDlet,Canvas,采用继承的方式,只有一个MIDlet,一般只有一个Canvas
Android:
Activity,View,采用继承的方式,只有一个Activity,一般只有一个View
5. 入口程序
J2ME:
MIDlet类
Android:
Activity类
6. 主程序结构
J2ME: package com.deaboway.j2me;

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

public class MyMidlet extends MIDlet {

protected void destroyApp(boolean arg0) throws

MIDletStateChangeException {

// TODO Auto-generated method stub

}

protected void pauseApp() {

// TODO Auto-generated method stub

}

protected void startApp() throws MIDletStateChangeException

{

// TODO Auto-generated method stub

}

}
复制代码Android: package com.deaboway.android;

import android.app.Activity;

import android.os.Bundle;

public class myActivity extends Activity {

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

}

}
复制代码7. 生命周期-开始
J2ME:
startApp(),活动状态,启动时调用,初始化。
Android:
onCreate(),返回时也会调用此方法。
onCreate()后调用onStart(),onStart()后调用onResume(),此时Activity进入运行状态。
8. 生命周期-暂停
J2ME:
pauseApp(),暂停状态,如来电时,调用该接口。
Android:
onPause()。
9. 生命周期-销毁
J2ME:
destroyApp(),销毁状态,退出时调用。
Android:
onStop(),程序不可见时调用onDestroy(),程序销毁时调用。
10. 刷新
J2ME:
高级UI组件由内部刷新实现。低级UI,canvas中通过调用线程结合repaint()来刷新,让线程不断循环。低级UI架构可以用MVC方式来实现,建议使用二级缓存
Android:
高级UIHandler类通过消息的机制刷新。onDraw()刷新接口,低级UI开发者用线程控制更新,在lockCanvas()和unlockCanvasAndPost()方法之间绘制。
如果去读API,我们可以发现J2ME中Canvas的repaint()与Android中View的invalidate()/postInvalidate()方法实现了相同的功能(连说明文字几乎都一样…),但是invalidate()/postInvalidate()两者却有着区别:invalidate()只能在UI这个线程里通过调用onDraw(Canvascanvas)来update屏幕显示,而postInvalidate()是要在non-UI线程里做同样的事情的。这就要求我们做判断,哪个调用是本线程的,哪个不是,这在做多线程callback的时候尤为重要。而在J2ME中,不管怎样直接调用repaint()就好了。
11. 绘画
J2ME:
Displayable类。J2me中所有可显示的组件都是直接或间接的继承了Displayable,直接的是Canvas和Screen。不同的继承导致了低级UI和高级UI的区别。J2me中现成的UI组件都是直接或者间接继承了Screen。只要调用Display.getDisplay(MIDLetinstan).setCurrrent(Displayabledisp),就可以把组件显示到手机界面上。切换界面的时候也可以使用该接口。
Android:
View类。可见的组件直接或者间接继承了android.view.View。通过Activity.setContentView(Viewview)就可以显示在android手机界面上,切换界面的时候也可以使用该接口。如果是直接继承了View而不是Android自带的UI组件,那么还要自己去实现它的刷新,类似J2me的低级UI组件。
12. 画笔
J2ME:
高级UI组件由内部刷新实现。低级UI,canvas中通过调用线程结合repaint()来刷新,让线程不断循环。低级UI架构可以用MVC方式来实现,建议使用二级缓存。
Android:
Canvas类,Android绘制的时候会传入一个参数Paint。该对象表示绘制的风格,比如颜色,字体大小,字体格式等。Android的Canvas不同于J2ME的Canvas,它更像于J2ME的Graphics,用来绘制。
13. 全屏
J2ME:
Canvas中SetFullScreenMode()。
Android:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);requestWindowFeature(Window.FEATURE_NO_TITLE);
14. 获得屏幕尺寸
J2ME:
Canvas类的getHeight()和getWidth()
Android:
Display d = getWindowManager().getDefaultDisplay();
screenWidth = d.getWidth();
screenHeight = d.getHeight();
15. 可绘区域
J2ME: int clipX = g.getClipX();

int clipY = g.getClipY();

int clipWidth = g.getClipWidth();

int clipHeight = g.getClipHeight();

g.clipRect(x, y, width, height);

g.setClip(clipX, clipY, clipWidth, clipHeight);//释放当前状态
复制代码Android: canvas.save();//保存当前状态

canvas.clipRect(x,y, x+width, y+height)

cavnas.resave();//释放当前状态
复制代码16. 清屏操作
J2ME: g.setColor(Color.WHITE);

g.fillRect(0,0,getWidth(),getHeight());
复制代码Android: // 首先定义paint

Paint paint = new Paint();

// 绘制矩形区域-实心矩形

// 设置颜色

paint.setColor(Color.WHITE);

// 设置样式-填充

paint.setStyle(Style.FILL);

// 绘制一个矩形

canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()),

paint);
复制代码17. 双缓冲
J2ME: Image bufImage=Image.createImage(bufWidth, bufHeight);

Graphics bufGraphics=bufImage.getGraphics();
复制代码Android: Bitmap carBuffer = Bitmap.createBitmap(bufWidth, bufHeight,

Bitmap.Config.ARGB_4444);

Canvas carGp = new Canvas(carBuffer);
复制代码18. 图片类
J2ME:
Image类,Image.createImage(path);
Android:
BitMap类,BitmapFactory.decodeResource(getResources(),R.drawable.map0);
19. 绘制矩形
J2ME:
drawRect的后两个参数为宽度和高度
Android:
drawRect的后两个参数为结束点的坐标
20. 按键
J2ME:
keyPressed()
keyRepeated()
keyReleased()
Android:
onKeyDown()
onKeyUp()
onTracKballEvent()
21. 键值
J2ME:
Canvas.LEFT…
Android:
KeyEvent.KEYCODE_DPAD_LEFT…
22. 触笔
J2ME:
pointerPressed(),pointerReleased(),pointerDragged()
Android:
onTouchEvent()
23. 数据存储
J2ME:
Record Management System (RMS)
Android:
SQLite数据库,SharedPreferences类
24. 连接
J2ME:
从Connector打开,可以直接在Connector.Open时设置连接是否可读写,以及超时设置
Android:
从URL对象打开,必须使用setDoInput(boolean)和setDoOutput(boolean)方法设置,使用setConnectTimeout(int)不仅可以对连接超时进行设置,还能设置超时时间,参数为0时忽略连接超时
25. 游戏开发包
J2ME:
javax.microedition.lcdui.game.*;
GameCanvas/Layer/LayerManager/ Sprite/TiledLayer
Android:
无专门针对游戏的开发包。
26. 音效
J2ME: Player s=Manager.createPlayer(InputStream);

s.prepare();//创建

s.start();//播放

s.stop();//暂停

s.stop();//关闭

s.release();//释放
复制代码Android:
MediaPlayer类处理背景音乐
SoundPool类处理一些简单的音效
27. 显示文本
J2ME:
String
Android:
TextView类
28. 打印信息
J2ME:
System.out.println()
Android:
Log类
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 20:54 , Processed in 0.411810 second(s), 51 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表