Polish 之接收Fire按键

  J2ME做界面开发时,高级界面是无法自定义接受按键响应的(如Form只能接收左右软键,而List则接收左右软键, Fire键),而只有低级界面(如Canvas, GameCanvas, CustomItem)才可以自定义按键接收(重写keyPressed, keyReleased等函数). 而在实际开发中,所有按键响应的发起都得由左右软键开始,比如选择, 退出等命令,一般情况下,这是足够的.然而界面不够友好,用惯了电脑软件的用户更倾向于直接点击某个命令按钮(即Button)来发起一个事件,很可惜的是J2ME中并没有button的概念.

  这篇文章的目的就是使高级界面可以接收Fire按键响应:

     1. 所有注册的Item都可以接收Fire按键响应,并执行特定动作

     2. 每个Item只能绑定一个Fire按键响应

  在这里,利用了Polish的UIAccess软件包(主要用于操控UI),并将Fire按键响应映射到命令Command上,实现了接收Fire按键响应.

 

  首先要要清楚的是高级界面为什么可以接受某些按键(如List可以接收Fire键,作为选中选项),高级界面其实都是由低级界面实现的,使用Canvas,你也可以定出自己的一套手机界面(如MyForm, MyList, MyTabbedForm),而其中如何响应按键呢?很简单了,重载Canvas的按键响应函数(keyPressed, keyReleased等)即可.

  知道了高级界面的实现,大概可以猜到J2ME的高级界面中是怎样实现的了,查下Form的源码,可以看到keyPressed()函数,J2ME的keyPressed()函数在这里进行了重载,实现了接受按键,那么我们现在想做的就是扩展按键响应的功能,使之增加Fire键的支持,自然而然,我们会想到继承J2ME的高级界面类,再次重载keyPressed方法,的确,这种方法是可行的,这可是下面将面用的方法.

 

  自定义的高级界面类作出了3个变化:

  1. 重载了keyPressed方法

  2. 提供注册方法RegisterItem(Item item, Command cmd)

      3. 提供注销方法Unregister(Item item)

 以MyForm为例,相关代码如下:

 

 其中RegisterItem将一个可以响应Fire键的Item注册到MyForm中,而响应Fire键的后续动作则映射到注册的命令cmd上,即对注册item点击Fire键将会执行commandItemListen中cmd的代码块。

  可以看到,将Fire按键响应映射到cmd上是由polish中UiAccess包完成的,UiAccess.handleCommand(item, (command)ht.get(item)),即对控件item发布命令cmd,至于要执行哪些动作,则完全与命令响应一样。

 一个简单的使用MyForm的例子:

 

 当选择IconItem,点击Fire键时,控制台会输出:Press cmd submit;响应成功。

 要注意的是,对于一些高级界面,已经对部分按键作出了响应,因此要保证重写的高级界面对原有按键的响应不丢失,如在MyForm中,keyPressed中有这样一句话:super.keyPressed(key);首先响应父类的keyPressed函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值