kuix这个项目的功能非常强大,把css和xml在j2me上几乎做到了极致。同时它的事件处理也相当的复杂,好坏与否暂且不说,基于kuix在css和xml模块设计上的造诣,想来事件处理设计的这么复杂也是有些道理的,在此分析一二,方便大家理解。
先插一个图,是kuix官网上的图,图画的相当的精美,使我看了之后有很大的学习画图的冲动,暂时忍住了,过一段时间一定得好好补上,不多说了,见图:
首先kuix并没有在回调Canvas的系统主线程中处理事件,而是采取了将事件记录下来,使用工作线程处理和分发事件的方法。在KuixCanvas的回调函数keyPressed(), keyReleased(),KeyRepeated()等函数中使用了如下的代码:
processKeyEvent(KuixConstants.KEY_PRESSED_EVENT_TYPE, keyCode);
processKeyEvent(KuixConstants.KEY_RELEASED_EVENT_TYPE, keyCode);
processKeyEvent(KuixConstants.KEY_REPEATED_EVENT_TYPE, keyCode);
将事件记录在了一个Vector中,pointer事件也是一样。
而处理事件的工作线程会在KuixMIDlet初始化的时候开始运行,严格来说,这个线程并非只为处理事件而存在,它是一个后台工作线程,维持了一个工作任务列表,它会处理其中每一个任务。而在KuixCanvas初始化的时候,就把事件处理任务丢进去了,并且这个任务的run()函数的返回值是false,也就是说这个任务在运行结束后并不会从任务列表中删除,换句话说,这个任务会被工作线程一次又一次的循环执行。
接下来,我们详细分析这个在程序初始化时加入工作线程的事件处理任务:
该任务每次运行时,会处理keyEvents和pointerEvents列表里面的所有事件。具体的事件处理逻辑,由Desktop的当前focusManager代理完成,因此focusManger实际上或许叫做eventManger更合适一些。
每一个widget都可以有一个focusManager(也可以没有),在Desktop中,包含了一个当前screen对象,和若干个(也许0个)popup的widget。如果存在popup的widget,并且其中有widget设定了focusManager,那么就以最顶层的popup的widget的focusManager对象为Desktop的currentFocusManager,如果没有popup,则返回screen的focusManager对象。
这个逻辑说起来有点绕,实际上符合我们使用窗口系统的习惯,一个应用程序有一个主窗口,然后可能在其上弹出若干个对话框之类的弹出窗口,有弹出窗口的时候,窗口焦点就从主窗口改变到最后一个弹出的窗口上了,所有的用户输入和事件也都发给这个窗口,kuix的Desktop类的这个设计正是如此。
决定了focusManager这个事件处理器,我们再来仔细分析一下它是如何处理事件的:
处理KeyEvent的时候,focusManager实际上有三个逻辑:
- 调用当前焦点控件的keyEvent处理;
- 快捷键处理;
- 默认的上下左右键的处理(当然就是移动焦点了);
其中2和3是互斥的,也就是如果这个key被某个控件绑定成了快捷键的话,就不再进行默认的移动焦点的处理了。在1中,基类Widget什么都没做,而如果当前焦点控件是一个ActionWidget的话,事情又会变得有意思一些,这个类型的控件,是一类响应fire键的keyPressed()事件和pointerReleased()事件的控件,换句话说就是响应”确定”这一用户行为的控件。
响应的机制也就是类似command机制,看这个例子:
<button action=”foo(a,b)”>foo</button>
没错,kuix的action是支持参数的,其次,kuix的action机制并没有一个全局的actionlist统一查找,而是分散在一个一个Frame中。这里出现了我们没有提到的Frame对象,熟悉MVC的话,一句话,Frame就是C,Screen是V,还有一个叫做DataProvider的对象是M。原则上一个screen对应一个frame,一般来说一个app不止一个screen,也就有多个frame对象,有一个FrameHandler对象维护了Frame对象的链表,action查找时,从表头开始,如果当前frame没有定义这个action,那么再去下一个fame对象中查找。
需要补充说明的就是左右软件的处理,左右软件当然可以通过绑定快捷键的方式将它们绑定到对应的Menu对象。但,由于这个绑定是Screen对象的一个普遍的行为,因此,kuix直接重载了默认的focusManager的processKeyEvent(),用硬编码的方式将这两个键与menu关联了起来。
处理PointerEvent的逻辑相对简单,就是找到对应坐标下的widget,然后调用widget的事件处理。对于ActionWidget的pointerReleased()事件,我们上面提过了,就是执行action逻辑。值得一提的是Pointer事件是向父容器传递的。最后,Kuix的Pointer事件支持Drag & Drop功能,这个待以后补充吧。
分享到:
相关推荐
目前广泛应用的J2Me框架,Kuix是一个使用XML/CSS来开发的lib,它提供了大部分UI组件,比 如:button,textfields,lists,menus,tabs等)。它的主页是源代码放在google code上,http://code.google.com/kuix,如果要使用...
首先,kuix-1.1.0是一个针对Java开发的库,其源代码提供了深入理解库功能和内部机制的机会。源代码通常包含了类、接口、方法以及其他相关资源,对于开发者来说,是学习和调试的关键资料。通过查看源代码,我们可以...
kuix-1.1.0.zip可能是kuix的更新版本,版本号1.1.0表示这是较早版本的一个升级,可能包含了新功能、性能优化或者错误修复。这种版本命名遵循了软件开发中的常见做法,即主版本号.次要版本号.修订版本号。".zip"格式...
【手机界面kuix-1.1.0】是一款专为移动设备设计的用户界面库,其核心是基于XML和CSS技术构建的。这个库的主要目标是简化开发者在创建应用程序时的UI开发工作,提供了一系列丰富的预定义组件,使得开发者能够快速、...
总结来说,Kuix是一个针对J2ME平台的强大开源框架,它通过提供丰富的组件、事件处理机制、数据绑定等功能,降低了开发复杂度,提升了开发效率。配合详细的文档和示例,开发者可以更轻松地进入J2ME应用开发的世界。...
Kuix( Kalmeo User Interface eXtensions) http://www.kalmeo.org/projects/kuix: Kuix是一个使用XML/CSS来开发的lib,它提供了大部分UI组件,比 如:button,textfields,lists,menus,tabs等)。它的主页是源代码放在...
- **教程**:从0到5,逐步引导开发者入门,涵盖了基本操作、界面设计、用户行为处理、国际化、动态数据展示以及自定义组件等方面。 2. **社区贡献**:Kalmeo社区鼓励开发者注册并分享他们的KUIX经验,促进项目的...