赛迪网 > IT技术 无线开发 > 文章
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

J2ME三种低级用户界面事件处理技术比较

发布时间:2006.01.09 06:09     来源:赛迪论坛    作者:Sabine

在J2ME的低级用户界面编程中,进行事件处理是经常使用到的技术之一,因为处理手机键盘上的按键事件是最常使用到的一种,所以就以此为中心,介绍一下实际使用过程中三种处理方式进行说明:

1、 覆盖keyPressed方法
在继承了Canvas的界面中,如果需要进行按键的处理,我们只需要在该类中覆盖Canvas类里面的这个方法,当手机按键被按下时,系统会自动调用该方法,并把被按下的按键的键值(keyCode)作为参数传递进来。所以如果需要处理按键事件,只需要在该方法内部检测按下的按键的键值就可以了。
在手机键盘上,可以简单的分为功能键区域和数字键区域,功能键指手机上的左右软键,中间的导航键以及接听电话和挂机键等,数字键区域指手机键盘上的0-9数字键以及*号和#号键。其中功能键的个数以及键值,不同的手机区别很大,而数字键的区域的按键个数,以及按键的键值都是一样的。

检测键值有如下两种方法:
a) 直接使用keyCode值
直接使用keyCode值的代码有如下两种,分别是:
if(keyCode == 52){
 //处理代码
}
或者:
if(keyCode == Canvas.KEY_NUM4){
 //处理代码
}
以上是使用按键处理中的两种代码书写风格,建议实际使用过程中使用第二种,这样代码容易阅读。 而在实际的游戏开发过程,除了一些特殊的功能键,例如手机上的左右软键,很少使用这种方式进行编写,而是采用下面的方式进行处理。

b) 使用gameAction(游戏动作)
gameAction是一种将手机键盘映射成为游戏动作的机制,通过这种机制,可以使不同手机上的按键都能转换为类似或者是相同的游戏动作,当然这个工作是由每个手机厂商实现的。

实际使用中的代码如下:
//将keyCode转换为游戏动作
int action = getGameAction(keyCode);
其中,keyCode和游戏动作的对应关系如下:
Canvas.UP——数字键2和向上导航键
Canvas.DOWN——数字键8和向下导航键
Canvas.LEFT——数字键4和向左导航键
Canvas.RIGHT——数字键6和向右导航键
Canvas.FIRE——数字键5和确定导航键
Game_A、Game_B、Game_C、Game_D分别对应键盘上的1、3、7、9或者是7、9、*、#键。

转换成游戏动作以后的事件处理代码如下:
switch(action){
case Canvas.LEFT://向左
 //处理代码
 break;
case Canvas RIGHT://向右
 break;
case Canvas.UP://向上
 break;
 ……
}

这个就是MIDP1.0中最常使用的按键处理方式。但是无论这种方式如何的优越,它还是无法摆脱keyPressed方法的束缚。

这样就将游戏编程中的三种逻辑:延迟、响应用户操作、重新绘制,隔离了开来,分别在用户线程和系统线程中进行。

为了解决这个不足,MIDP2.0在GameCanvas内部引入了一种新的事件处理方式按键状态(keyStates)机制。

2、 使用keyStates
按键状态指系统通过一个变量来记录手机键盘上每个和游戏动作有关的按键,如果该键按下则设置对应的位(bit)为1,否则为0,然后可以通过位运算获得哪个按键被按下。

注意:按键状态只能在MIDP2.0的GameCanvas子类中里面使用,而且只能处理和游戏相关的按键。如果支持该处理方式处理游戏按键的话,将在keyPressed方法中无法接收到和游戏相关的按键,其他按键还可以正常接收响应。

如果要使用该功能,首先要在GameCanvas子类的构造方法中,让该界面支持该操作,这个步骤可以使用GameCanvas的构造方法来实现,代码如下:
//使该界面支持按键状态处理
super(true);
这样该界面就可以进行按键状态处理。和前面的按键处理不同,该种处理方式可以脱离keyPressed方法的限制,也就是说可以写在任意的处理方法内部,只需要在线程中调用即可。

使用该处理方式,无论线程中的延迟多么长,系统都可以保持该按键的状态。这个好处是其他处理方式无法做到的。

首先,获得游戏按键状态,代码如下:
//获得游戏的按键状态
int states = getKeyStates();
该代码的作用是获得当前按键状态,并把按键状态清空!具体的处理代码如下:
//处理按键状态:
if((states & GameCanvas.LEFT_PRESSED) != 0){ //向左
}
if((states & GameCanvas. RIGHT_PRESSED) != 0){ //向右
}
在MIDP2.0的Game API处理中,这个方式使手机游戏开发重新回归到传统的模式中,也使游戏的处理更加灵活。

(T127)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 在J2ME编程中时间处理常用方法详解 (01-06) · J2ME程序开发中随机数字处理全攻略 (01-06)
· J2ME手机程序开发中的九大注意要点 (12-15) · J2ME程序开发新手入门九大要点系列之一 (11-29)
· J2ME开发之手机键盘注意问题 (11-01) · 教您如何利用Java Swing实现游戏开发 (10-18)
· 移动开发:J2ME中定点库MathFP使用入门 (10-09) · 新手入门:J2ME基本概念解析 (09-28)
· 手把手教您如何搭建WAP应用开发环境 (09-06) · 应用Java技术开发WAP应用实例程序分析 (09-06)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
[政务][电信][金融][农业][制造业][中小企业]
[CIO][ERP][协同][IT管理][中间件][电子商务]
[政策][地方][专家][评估][辞典][博客][社区]
· 专题:一路畅通构想曲——让出行不再遭遇堵车
· CIO工作亲历:企业ERP选型不能忽视"选人关"
· 综述:信息化建设给中国监狱带来的各种变化
· 金融业风险管理和法规遵从有五点需考虑的因素
· 保险业CIO关注:该如何建立统一高效的CRM体系
· 调查显示:多数CIO对IT规划仍存在困惑和误解
  博客·论坛 ·曾剑秋·项立刚·Java学习·网管