s60按键处理模型

来源:互联网 发布:魔域名字大全 编辑:程序博客网 时间:2024/05/21 11:05

做了一段时间航海桌面,被长按,短按,组合键各种按键逻辑搞的死去活来。

功能堆积的太多后,根本是一团浆糊。

 

正好开发到一个段落,重新整理了按键逻辑,把按键识别和执行功能分离。

 

识别模块负责将按键事件串对应成可以接受的按键状态。把不需要关心的噪音过滤掉。后面记作Filter

执行模块根据按键状态执行功能。

 

S60的按键事件分成3中类型:Down,Event,Up。

 

其中Event里的Repeats属性会变化,有0和1两种值。还有一个Modify属性,不过基本没用。后面把Event且Repeat(0)记作Event,Event且Repeat(1)记作Repeat

 

一个短按过程

Down Event Up

一个长按过程

Down Event (Repeat)+ Up

 

常见情况是一个键的长按,短按有不同的功能。

必须先出现一个Event事件,然后等待后面的时间出现,如果是Up则是短按,如果是Repeat则是长按。如果是长按,需要忽略后面的Repeat和Up事件。

 

理想的实现是,通过Filter,在长按的时候收到一个状态表示长按,短按的时候收到一个状态表示短按。

由于状态和之前收到是按键事件串是一一对应的,所以,状态可以用一个堆栈表示,按照接受顺序讲按键事件入栈就可以了。

 

可以用一棵树来描述按键接受逻辑。当做DFA来处理。

 

终结节点是可能的接受,在这个节点可以返回。

非终结节点是过度用的输入事件。

 

一个识别短按的DFA看起来是这样的

 

短按DFA

 

一个短按长按都要识别的DFA看起来是这样的

 

短按,长按同时识别的DFA

 

定义下这个DFA。

每个节点包含以下属性

 

1. 按键扫描码

2. 按键字符码

3. 重复标志

4. 按键类型

5. 控制位(终结,匹配字符码,匹配扫描码,匹配重复标志)

 

匹配时根据控制位进行对应判断。控制位不表明的属性不参与匹配。

 

然后把各种按键的DFA组合成一个DFA,作为Filter的控制逻辑。

 

当一个键盘几乎所有的键都有对应功能的时候,这个很管用

 

比如我现在做的这航海桌面。

每个按键的长按短按都有一种功能。

 

通过这个Filter,就可以简单的把Event和Repeat组成的时间串,分解成互相没关联的事件。否还要记录状态,这十分麻烦。

 

下面 LS表示左键,RS表示右键,其他的都是字符按键。

 

这个看起来很漂亮。很多部分都一样,都是长按短按都识别,创建代码也会很简单。只有一个左键(LS)比较特殊,因为有短按长按识别还有组合键识别。

 

综合起来的按键识别DFA

 

这里有个组合键,LS再RS。

 

通过引入超时事件就很容易处理。每次收到UP事件后就引入一个超时。如果超时了,那么这个匹配路径就被强制退栈。如果这个路径上有终结点,就返回最后一个终结点作为最后结果。

 

其实这也就是一个普通了不能再普通的连续按键判断逻辑用DFA画一边。

 

 

识别成功后怎么知道到底是匹配了那个路径?把记录堆栈扫描一下就行了。

 

终于不用再为这种东西烦恼了。

 

以后考虑加入用xml描述DFA,这样就可以录下操作,描述不同的行为。

 

定义

 

 

实现

 

 

使用Filter

 

原创粉丝点击