|
因为有这么多的命令,所以把项目目前状态和位置下不使用的命令隐藏起来,感觉会好些。为了保持逻辑简单,我们从项目中删除了所有命令,然后再有选择地重新插入命令。需要了解的是,删除项目不需要的命令不会有损害,而且如果您把同一命令加入了二次,也不会得到重复。另外一个好消息是:象我们一样地经常重建命令列表,对应用程序的响应性没有什么可以感觉到的冲击。
我们回忆一下,OutlineItem 用水平导航键来改变缩进级别。在没有水平导航键的设备上,缩进和凸出的命令是必需的,但是在有水平导航键的设备上会形成冗余。幸运的是,有一种方法可以让这些命令只在需要的时候才可见。
CustomItem有一个getInteractionModes()方法,我们可以调用它来确定设备提供了哪些UI能力。这个方法返回一个位掩码,您可以用它来测试CustomItem定义的接口能力常数:KEY_PRESS, KEY_RELEASE, KEY_REPEAT, POINTER_PRESS, POINTER_DRAG, POINTER_RELASE, TRAVERSE_HORIZONTAL, 和TRAVERSE_VERTICAL。updateCommands()方法调用 hasHorizontalTraversal()方法和 hasPointerPress()方法,来利用这个功能:
<%@ control language="c#" autoeventwireup="true" codefile="webusercontrol2.ascx.cs" inherits="webusercontrol2" %>private boolean hasPointerPress()
{
return ( getInteractionModes() & POINTER_PRESS ) != 0;
}
private boolean hasHorizontalTraversal()
{
return ( getInteractionModes() & TRAVERSE_HORIZONTAL ) != 0;
}
|
如果设备没有水平导航键,或者设备支持尖笔或者鼠标,那么OutlineItem就隐藏缩进和凸出命令。就像Canvas 所做的那样,CustomItem用固定的设备支持一些用于响应轻击的方法。OutlineItem重写了pointerPressed(),这样,如果用户在展开指示器上轻击,就可以切换展开状态。
<%@ control language="c#" autoeventwireup="true" codefile="webusercontrol2.ascx.cs" inherits="webusercontrol2" %>protected void pointerPressed( int x, int y )
{
// 如果在小部件区域内
if ( x < FONT_HEIGHT )
{
if ( isCollapsed() )
expand();
else
collapse();
}
}
|
传递给这个方法的坐标相对于项目显示区域的左上角,所以简单地比较X坐标就会揭示指针按下的位置是不是靠近展开指示器。流行的新的MIDP2.0设备,比如Sony Ericsson P900和Palm Tungsten系列接受尖笔输入,所以在您的应用程序里实现对指针交互的支持,会是个好主意。
MIDP初始的设计目标之一,就是让您能够编写在可以在具有不同能力、窗体因素的不同设备上运行的应用程序。MIDP 2.0让这一目标变得更容易,所以请充分利用这个机会。
结束语
现在您可以用各种以前在MIDP 1.0中没有的可视效果和验证来编写定制组件了。 窗体增强的布局能力,为您提供了对表示更多的控制,CustomItem让您不必编写和维护设备专用的代码,就可以调整行为符合设备自身的观感。MIDP 2.0为基于窗体的移动应用程序中的用户界面的定制,开启了近乎没有限制的大门。
致谢
我要感谢Roger Riggs对代码改进的建议,还要感谢Brian Christeson对文字所做的无数改进。最后,我还要感谢我的家庭,使我能够抽身出来写作。
关于作者
Michael Powers是mpowers LLC的负责人,是桌面及无线平台软件顾问,从Java问世起,他就一直在使用各种不同形式的Java技术。他的获奖作品Piranha Pricecheck MIDlet正在风靡,可以从mpowers.net 免费下载该作品。
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)
|