一、J2ME 体系结构
KVM虚拟机
JAM java应用程序管理器:下载,安装,运行,暂停,卸载, jar 应用程序原始文件 jad 应用程序描述文件
CLDC 有限连接设备简表。个人移动信息设备,指那些可以进行间歇性网络连接的设备。
连接受限设备(Connected Limited Device Configuration CLDC)面向的目标设备是小型的资源。CLDC总的来说是与JAVA语言完全兼容的,但是需要注意以下3点:
1、不支持浮点数据类型,没有float和double。
2、不支持类实例(class instance)的终结(finalezation)。即不存在Object.finalize()方法。
3、有限的错误处理。大部分Java.lang.Error的子类都未被支持。
CLDC包换了一个基本的J2ME运行环境,其中包括虚拟机和核心的JAVA类库。其
中只保留了JAVA规范中定义的最核心的3个包,即java.io、java.lang、java.util、并重新顶了一个新的包javax.microedition。 java.io 标准JAVA I/O包 J2SE I/O包的子类
java.lang 核心的语言包J2SE的子集
java.util 实用类J2SE标准实用类的子集 javax.microedition CLDC的通用连接框架类和接口
MIDP(Mobile Information Device Profile)是位于CLDC上层的Profile(简表),是目前J2ME平台中发展最成熟、应用最广泛的Profile。
MIDP由javax.microedition 包组成,其中包括: javax.microedition.rms javax.microedition.midlet javax.microedition.io javax.microedition.lcdui javax.lang javax.util
MIDP上层的应用程序被成为MIDlet。
MIDlet程序的运行是由starApp()开始执行、pauseAPP()暂停(挂起)、destroyApp()销毁(退出)3个方法控制的。
通常一组相关的MIDlet的集合被成为MIDlet suite(MIDlet 套件)。
Display类负责管理显示屏幕对象(也包括低级屏幕对象 Canvas),每个MIDlet都有一个Display实例,通过它可以获取关于设备显示屏幕的基本性能信息。
Display类
isColor——判断屏幕是否是彩色的
numColors——如果是彩色手机,则获得支持的颜色数量,如果是黑白手机,则获
得支持的灰度等级。
numAlphaLevels——获得设备对于透明度的支持
getBestImageHeight——获得设备支持的图片最佳高度(Alert,List,。。。) getBestImageWidth——获得设备支持的图片最佳宽度(Alert,List,。。。) getColor(x)
x{ Display.COLOR_BACKGROUND--系统背景色 }
Display.COLOR_BORDER--系统边线色
Display.COLOR_FOREGROUND--系统前景色
Display.COLOR_HIGHLIGHTED_BACKGROUN--高亮度系统背景色 Display.COLOR_HIGHLIGHTED_BORDER--高亮度系统边线色 Display.COLOR_HIGHLIGHTED_FOREGEROUND--高亮度前景色
二、高级用户界面
类Screen和Canvas都是Displayable类的子类,通过调用Display的方法setCurent可以使屏幕对象可见。
1、Screen
高级屏幕对象都是Screen的子类,包括:
[1]、List :选择列表,从几个预定义的选项中进行选择,常用于制作选择菜单。
Exclusive(单选式),Implicit (隐含式),Multiple(多选式)
[2]、TextBox :是一个比较简单的文本编辑器,常用于输入文本。 TextBox (标题, 内容, 最大长度, 类型)
[3]、Alert:用来在设备上显示一个警报或警告屏幕。 [4]、Form:(String 标签),该类可以添加Item的子类。
Item的子类包括: StringItem 静态文本显示
ImageItem 静态图片显示
TextField 带约束的文本类型输入
Gauge 用于进度条
ChoiceGroup 用于一个选项集合的单选或多选
操作Item的子类,必须实现ItemStateListener接口,该接口仅包含一个监听者必须实现的方法:itemStateChanged(Item item)
Ticker是滚动条,在MIDP1.0之中Ticker只能用在Screen的子类,但是MIDP2.0之后,已经可以用在Displayable的子类
方法前用set 是设置,用 get 是获取。
2、Command (命令、按键)
Command(String 标签,int Command类型,int 优先级);
Command要实现CommandListener接口,重写接口中的方法commandAcion(Command 那个Command,Displayable )。
三、MIDP 1.0 低级用户界面 1、Canvas (画布)
图形绘制和应用程序的一些低级事件处理方法。由于Canvas是抽象类,所以
在建立Canvas子类的时候,要求提供paint()方法的实现。 Paint(Graphics画笔 g) 绘制
getWidth() 获取屏幕的宽度; getHeight() 获取屏幕的高度; draw 绘制的都是“线”;
fill 绘制的都是“面”;
repaint() 重绘屏幕,实现动画的一个方法; keyPressed(int keyCode) 按键按下时调用; keyReleased(int keyCode) 按键释放时调用; keyRepeated(int keyCode) 按键重复时调用; hasPointerEvents() 是否支持触摸屏
hasPointerMotionEvents()是否支持触摸拖拽 isDoubleBuffered()判断是否支持双缓冲 hasRepeatEvents() 是否支持重复按键 hideNotify() 当前屏被蔗住的时候被触发 showNotify() 当前屏幕显示的时候被触发 setFullScreenMode(boolean mode)设置全屏
2、Graphics类
绘制图片,字符串,巨型框,弧形,线
填充巨型,扇形,
setStrokeStyle() 设置绘制样式(实线SOLID,虚线DOTTED)
锚点
代表绘制图形跟字符串时,所制定的X,Y作标志的是何种意义。 7种定义:
Graphics.TOP 上 Graphics.BOTTOM 下 Graphics.LEFT 左 Graphics.RIGHT 右
Graphics.HCENTER 水平中心 Graphics.VCENTER 垂直中心 Graphics.BASELINE 基线
图片支持:左上(20),上中,右上, 左中,中心,右中,左下,下中,右下等9个点。
文字支持:左上,上中,右上, 左下,下中,右下等6个点。
3、Font类
getDefaultFont() 取得代表系统缺省使用的字体对象。
getFont(face,style,size) 取得特定字体对象 各参数选项: < 尺寸(size):>
Font.SIZE_SMALL Font.SIZE_MEDIUM Font.SIZE_LARGE < 外观(face):>
Font.FACE_MONOSPACE Font.FACE_PROPORTIONAL Font.FACE_SYSTEM < 样式(style):>
Font.STYLE_BOLD
Font.STYLE_ITALIC Font.STYLE_PLAIN
Font.STYLE_UNDERLINED
4、Image 图片加载
getWidth() 获取图片的宽 getHeight() 获取图片的高
getGraphics() 获取该图片的画笔(一般在使用双缓冲的时候使用) drawImage() 绘制图像
createImage(...) 创建图片对象
不能用new方法声称Image类。而是用Image类的静态方法createImage()方法。 通常图片采用的格式是.png,压缩格式为0模式,无损压缩。 如果加载图片数量过多,使用StringBuffer.
< setClip() > 设置局部绘制剪切区,局部绘制。
用线程实现动画,sleep()方法控制动画的桢。如果处理的数据越多,时间要设
的更少,一般设为80左右。
游戏开始界面:
SP—CP—TITLE(PRESS ANYKEY任意键)—INTRO—GAME—MENU
SP代表运营商,CP代表开发商,MENU代表菜单,INTRO代表说明。
GS(Game State)游戏状态。
LOGO、TITLE、MENU、GAME,一定要设为常量。LOGO加载要在状态转变的时候,状
态没改变,不要加载。 Render() 渲染;
gameAtion() 处理
5、动画的实现
J2ME通常采用线程来实现动画的循环。Stop()方法一般在终止动画退出程序时调用。
例: While(true)
{ }
Try { }
Catch(Exception e) { }
Thread.sleep(1000);
6、数据存储
RMS(Record Managamet System)数据管理系统,是一个小型的数据库。
在相同的MIDlet Suite中,每个RecordStore(纪录仓库)都拥有自己独一无二的名字,大小不能超过32个Unicode字符,同一Suite下的MIDlet都可以共享这些RecordStore。
数据库操作
RecordStore.openRecordStore(String, boolean)打开数据库,(名称,...),当boolean类型是false时,将表示如果没有就不再访问。是true 时,表示如果没有的话,将创建一个新的纪录。
RecordStore.closeRecordStore()关闭数据库;有几个open ,就要有几个close 。 RecordStore.deleteRecordStore(String) 删除数据库 closeRecordStore()关闭数据库
getLastModified():返回记录仓储最后更新时间。 getName():返回一个已经打开了的记录仓储名称。 getNumRecords():返回当前仓储中记录总数。
getSizeAvailable():返回当前仓储中可用的字节数。
getVersion():返回数据库被操作的次数。
listRecordStores():获取该MIDlet套件中所有的记录仓储列表。 addRecord(): 添加 setRecort(): 修改 deleteRecort(): 删除 getRecord(): 获取 reset(): 复位
数据库纪录操作
addRecord(byte[] data, int offset, int numBytes)添加byte数组类型的数据 deleteRecord(int recordId),传入目标记录的ID以后,可以从记录仓储中删除记录。
setRecord(int recordId, byte[] newData, int offset, int numBytes)可以修改一个指定ID的记录值。
增加纪录时,可以将基本数据类型转换成字节数组,使用DateOutputStream与ByteArrayOutputStream共同将对象值转换为正确的字节流。
RecordListener对数据库进行监听
recordAdded:当一条新的记录被添加到仓储空间的时候,该方法被触发。 recordChanged:当一条记录被修改时使用。
recordDeleted:当一条记录从记录仓储中删除时调用。
RecordEnumeration数据库枚举类型器
RecordStore的enumerateRecords()返回一个RecordEnumeration对象,三个参数:过滤(RecordFilter),排序(RecordComparator),同步(true)。
四、MIDP 2.0
1、GameCanvas类
super(boolean) 设置是否是游戏状态(keypressed是否可以使用)
getGraphics() 获取画笔
flushGraphics()将后背缓冲区绘制的图形显示在屏幕上
getKeyStates()获取按键状态 按键状态
DOWN_PRESSED FIRE_PRESSED LEFT_PRESSED RIGHT_PRESSED UP_PRESSED
GAME_A_PRESSED GAME_B_PRESSED GAME_C_PRESSED GAME_D_PRESSED
2、Layer类
getHeight() 获取当前图层的高
getWidth()获取当前图层的宽 isVisible()该图层是否是现实状态 move(x,y)移动
paint(g)绘制
setPosition(x,y)设置位置
setVisible(boolean) 设置是否显示该图层
3、LayerManager类
append(Layer) 添加图层(图层或精灵) getLayerAt(int index)通过下标获取指定图层 getSize()获得该图层管理器中图层的个数 insert(Layer, index)在指定下标插入图层 paint()绘制
remove(Layer)将指定图层移除
setViewWindow(x,y,w,h)设置显示区大小
4、TiledLayer类
TiledLayer(int columns, int rows, Image image, int tileWidth, int tileHeight) 构造方法(地图行数,地图列数,地图图片,Tile的宽,Tile的高)
createAnimatedTile(int staticTileIndex) 创建活动Tile返回下标从-1开始 setAnimatedTile(int animatedTileIndex, int staticTileIndex) 通过活动Tile下标,设置该活动cell新的tile
getAnimatedTile(int animatedTileIndex) 得到动画分块的静态图像分块序号 fillCells(int col, int row, int numCols, int numRows, int tileIndex) 填充指定的单元格区域
getCell(int col, int row) 获取单元格区域
getCellHeight() 获取单元格的高 getCellWidth() 获取单元格的宽
getColumns() 获取单元格的列数 getRows() 获取单元格的行数
setCell(int col, int row, int tileIndex) 设置单元格区域
setStaticTileSet(Image image, int tileWidth, int tileHeight) 重新创建分块图像。
paint(Graphics g)
5、Sprite类
Sprite(Image image, int frameWidth, int frameHeight)构造方法,Sprite的
图片,Sprite的宽,Sprite的高
collidesWith(Image image, int x, int y, boolean pixelLevel) 与图片碰撞 collidesWith(Sprite s, boolean pixelLevel) 与Sprite碰撞 collidesWith(TiledLayer t, boolean pixelLevel) 与图层碰撞
defineCollisionRectangle(int x, int y, int width, int height) 设置默认巨型碰撞区
defineReferencePixel(int x, int y) 设置默认参考点 getFrame() 获取Sprite当前贞
getFrameSequenceLength() 获取Sprite当前贞序列长度 getRawFrameCount() 获取Sprite总贞数
getRefPixelX() 获取参考像素点在绘图坐标系统中的位置 getRefPixelY() 获取参考像素点在绘图坐标系统中的位置 nextFrame() 下一贞 prevFrame() 上一贞
setFrame(int sequenceIndeg) 设置Sprite当前贞
setFrameSequence(int[] sequence) 设置Sprite的贞序列
setRefPixelPosition(int x, int y) 设置Sprite的参考坐标在系统坐标系中的位置
setTransform(int transform) 设置Sprite旋转
TRANS_MIRROR 左右镜像翻转
TRANS_MIRROR_ROT180 先左右翻转在顺时针旋转180度 TRANS_MIRROR_ROT270 TRANS_MIRROR_ROT90 TRANS_NONE TRANS_ROT180 TRANS_ROT270
TRANS_ROT90
paint(Graphics g) 绘制
五、网络与多媒体
1、media包
Manager声音管理器
Manager.playTone(int,int,int)设置声音音调,(高低音,声响时间,声响大小) Manager.createPlayer(InputStream ,String) 获取Player,(音频文件流,音频类型)。
Player音频播放器
Player.realize()实行,就绪 Player.strat()播放
Player.stop()停止
Player.setLootCount()设置播放次数,-1无限,不能为0,1一次,2二次
2、网络
GCF:CLDC通用网络框架(CLDC Generic Connection Framework) javax.microedition.io包
使用HTTP 和外界沟通:Connector.open(\"http://www.sun.com.tw\") ;
使用Socket 和外界沟通:Connector.open(\"socket://192.168.0.3:8080\") ; 使用Datagram 和外界沟通: Connector.open(\"datagram://www.sun.com:9000\") ; 使用文件方式和外界沟通:Connector.open(\"file:/input.txt\") ; 使用串口和外界沟通:Connector.open(\"coom:0;baudrate=9600\") ;
HTTP请求
HTTP_OK:200:请求成功
HTTP_BAD_REQUEST:400:由于格式错误,请求失败
HTTP_FORBIDDEN:403:请求有效,但是由于权限原因不允许执行 HTTP_NOT_FOUND:404 :请求资源不存在
因篇幅问题不能全部显示,请点此查看更多更全内容