Nokia SDK 2.0 for Java: 移植向导
文章信息
Contents |
Introduction
Series 40 Full Touch 平台首次引入了Series 40手机全触摸屏幕显示,这些手机没有物理键盘,仅仅只有一个拨号键和挂机键,文字输入时通过虚拟键盘来实现的。 API改变的同时,同时有些UI风格的改变,特别是一些Commands。没有使用画布的MIDlets不必有任何改变就能在FULL Touch上运行,然而基于画布的MIDlets则需要一些小的改变。
尽管Nokia SDK 2.0 for Java相对Nokia以前的Java SDK版本有着重大变化,但是由于Nokia SDK 2.0 for Java有着良好的向下兼容性,
所以对于应用移植来说还是比较容易的,当然你能熟悉本文所介绍的一些方法,那么在移植过程中相信你会更加得心应手。
本文的目的就是展示FULL Touch平台上面有那些改变,以及如何修改你的存在的MIDlets以便在Series 40 Full Touch上运行,同时能够使用触摸等新的功能。
Summary
Full-touch 的屏幕布局
左图中显示了一个full-touch设备的屏幕界面布局。 Action按钮是一个菜单按钮。点击它能够打开选项菜单,如右图.
更多的信息,请参考Java Developer Library --> Developer's guides > UI and graphics > Touch UI > Touch interaction in Series 40 > Series 40 touch UIs.下的"Full Touch devices"部分。
判断当前设备类型
那么如何在代码中,判断当前的手机是否是全触摸Series 40设备呢?可以通过系统属性com.nokia.keyboard.type 来判断,如果字符串是“None”,那么该手机就是全触屏手机。
if (System.getProperty(“com.nokia.keyboard.type”).equals(“None”)) {
// this is a full-touch device
}
可以采用下面的方法来判断是否是触摸的而且带键盘的手机:
这里我们首先检测是否支持frame animator API(仅仅支持触摸设备)。如果支持,但是不支持full-touch, 那么该设备就是触摸的而且带键盘的设备。
画布的显示
全触摸设备的屏幕的大小400x240像素,这是不同于以前的QVGA设备的320x240。这意味着屏幕比例从4:3 改变为 5:3。对于一个基于canvas的程序的用户接口, 如果UI中有控件是设定的固定大小,那么就需要根据新的屏幕尺寸比例做出调整,缩放。如果程序是通过获取display的尺寸来设定UI组件的大小, 那么它就能根据新的屏幕动态调整,所以对这样的程序移植到Full Touch,不需要做任何的改变。
Commands位置的分配规则
除了Command.BACK 和 Command.EXIT外,所有的命令都被放置到了左上角的Action Button 2里面。如果只有一个Command.BACK 或者 Command.EXIT命令,它就会被放置在右下角的导航区域。如果同时需要者两个命令,那么Command.BACK会被映射到Back图标上,而Command.EXIT就被放到Action Button 2里面了。
通过IconCommand (com.nokia.mid.ui.IconCommand)这个类,单独的一个icon能被显示到右上角的Action Button 1的位置。如果有多余1个的IconCommand被添加到display,那么只有一个会被显示到Action Button 1的位置, 其余的会被放置到Action Menu2 下面了。你也可以使用系统定义的icon(通过使用在类中定义的一个icon id)或者通过你自己定义的IconCommand的icon。一个MIDlet首要的action能够被映射到Action Button1.
如果没有这样的一个使用频繁的主功能按钮,那么不一定必要使用该action button 1。如果在你的程序中没有任何的IconCommand,但是有个Command.OK类型的命令,那么一个记号图标将会被显示在Action Button 1的位置。
如果在选项菜单下没有任何命令(也就是说只有一个单独的命令在Action Button 1,以及Command.EXIT 类似命令在Back icon位置),那么这个选项菜单- action button 2的图标将会被dimmed,你不能够改变或者设置它的icon。
在更早的设备中,点击选择键(以前也叫MSK)相当于执行Command.OK命令,因此如果被Command.OK映射的action通过钩形icon来呈现是有道理的,同时不需要任何代码的改变。
命令IconCommand.ICON_OPTIONS 和 IconCommand.ICON_OK的显示分别如下图中 左右圆圈标记区域:
虚拟键盘的使用
虚拟键盘显示在屏幕的下半部,在下列情况下它将会被显示出来: 对于TextField,当你点击editor编辑区域时,一个SYSTEM_KEYBOARD类型的虚拟键盘将会被自动显示。在这里,尽管虚拟键盘覆盖了 部分显示区域,但是editor会自动向上移动,以便保证正在被编辑输入的文字是可见的。对于TextBox,虚拟键盘则是一直可见的,而且文本会自动滚动,从而保持正在被编辑的部分不会被虚拟键盘遮挡。
对于Canvas, GameCanvas或者 CustomItem也许会需要一个键盘,用来输入文字或者按键,
- 对于普通的canvas:1. 点击菜单icon,从而启动选项菜单。
2. 在选项菜单里面默认包含了“Open Keypad”命令。
- 对于full canvas:
1. 长按display的任何位置就可以调出选项菜单。
2. 在选项菜单里面默认包含了“Open Keypad”命令。
- 对于Midlets你可能需要禁止长按来启动选项菜单,或者说在选项菜单中禁止“Open Keypad”命令,那么你可以通过下面的方法来实现:
VirtualKeyboard.hideOpenKeypadCommand然而,这样的话,由于底层的canvas和CustomItem组件没有实现触摸功能,因此你需要实现该功能,以便接受触摸事件,以及做它们做出相应的处理。
MIDlet也可以通过获取CustomKeyboardControl然后通过调用它的方法来显示虚拟键盘,如下:
CustomKeyboardControl customKeypad;
customKeypad = VirtualKeyboard.getCustomKeyboardControl();
customKeypad.launch(
VirtualKeyboard.VKB_TYPE_ITUT,
VirtualKeyboard.VKB_MODE_DEFAULT);
如果你想从display上移除虚拟键盘,你可以使用下面的方法:
customKeypad.dismiss();
由于Full Touch中有很多种类不同的虚拟键盘,因此我们应该做出一定的代码设置从而为用户在canvas上输入选择合适的键盘种类。比如,当我们从具有方向键的设备上移植游戏时,我们应该选择VKB_TYPE_GAME 虚拟键盘。
MIDlet也可以通过注册一个虚拟键盘的监听器来判断当前虚拟键盘是否被打开,如下的静态方法调用:
VirtualKeyboard.setVisibilityListener注意,我们并没有办法来设置虚拟键盘所在display上的具体位置,这有可能导致它会遮挡住接收触摸输入的区域( 比如正在输入的文字)。但是这种情况,一般只会在底层的UI模块中发生,比如基于Canvas但是不是基于Screen的UI组件。如果这种情况发生后,怎么办呢?一个可行的方案就是找出display的仍然可见的部分,然后移动接收文字输入的到可见的display的区域。如果不能接收这样的处理,那么就不能使用虚拟键盘。Display的特定区域能够与特定的事件关联起来,比如说,点击屏幕的左边的区域能够触发Canvas.LEFT按键事件。同理,滚动的动作能做能够与flick手势关联。
字体相关
由于屏幕尺寸已经改变,字体的大小可能也与早期的设备不同了。字体的大小会根据不同的屏幕尺寸以及full-touch的屏幕大小而与以前Series 40设备而有所不同。 如果你在早期的Series 40设备上基于字体的大小,指定了文本的布局方式,但是这种文本的布局在full-touch上有可能有不同的表现。
Full-touch 中一些新的API
在full-touch中,对一些已经存在的类做出适当的修改,同时也添加了一些新的类。这些API支持一些新的功能,比如说多点触摸,新的UI元件, 比如Category Bar,Pop-up lists 和 Badges. 当然对于这些API只有你在需要它们提供的一些新功能或者它们提供的一些新的UI元件的时候才需要使用它们。
- Category Bar,请参见:
Java Developer Library Developer's Guides > UI and graphics > LCDUI > Using the LCDUI > CategoryBar 这是一个首选的用来实现程序view之间快捷切换的类。
- Badge API,请参见:
refer Java Developer Library Developer's Guides > UI and graphics > User interfaces in Java ME > Using badges on application icons Badge API 对于显示后台MIDlet的状态变化是极有用的。由于homescreen没有区域用来向用户显示后台程序的状态变化,因此有了这个API,通过Badge API能够在菜单里面的程序图标上显示短的状态信息。
- Orientation API, 请参见:
Java Developer Library Developer Guides >UI and graphics > User interfaces in Java ME > Orientation API 用来判断当前屏幕的方向,获取屏幕方向改变的事件通知,同时也可以用来设置改变屏幕的方向。
- Pop-up lists, 请参见:
Java Developer Library Javadocs > Nokia UI API Appendix > Pop-up list API
多点触摸
在Series 40的Full touch设备中引入了多点触摸的功能,我们可以在同一时间使用两个或多个手指触摸显示设备。手指可以向不同的方向移动。 因此MIDlet需要获取所有触点的信息。如果你想让多点触摸与用户的交互更加简单,直观,你就需要处理它们的事件了。
MultipointTouch 这个类 (com.nokia.mid.ui.multipointtouch.MultipointTouch) 能够被用来获取多点触摸的数据信息。这个类记录了所有手指触摸信息。所支持的最大的触电的数目可以通过下面的方法得到:
为了能够接受多点触摸事件,首先,你需要得到一个MultipointTouch类的实例,然后注册一个MultipointTouchListener的接口实现到MultipointTouch实例。
MultipointTouchListener接口可以在MIDlet中以一个嵌套类或者内部类的方式实现。如下:
MultipointTouch.getInstance().addMultipointTouchListener (
new MultipointTouchListener () {
public void pointersChanged(int[] pointerIds) {
// Code to handle the multipoint touch event
}
};);
Pinch 手势
手势可以通过普通的用户的触摸动作来识别。由于手势是通过平台来识别的,它使得程序与平台的外观能够协调一致。MIDlet能从平台系统通过GestureEvent接口来接收手势动作事件。
pinch gesture是由多点触摸引入的新的手势动作。新的pinch gesture对应于full-touch设备的GestureInteractiveZone.GESTURE_PINCH事件。为了处理pinch gesture手势,你可以通过GestureEvent中下面的接口来实现:
- getPinchCenterChangeX
- getPinchCenterChangeY
- getPinchCenterX
- getPinchCenterY
- getPinchDistanceChange
- getPinchDistanceCurrent
- getPinchDistanceStarting
更详细的细节,请参见Java Developer Library Javdocs > Nokia UI API Appendix > Gesture API > com.nokia.mid.ui.gestures





(no comments yet)