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。
每个节点包含以下属性
1. 按键扫描码
2. 按键字符码
3. 重复标志
4. 按键类型
5. 控制位(终结,匹配字符码,匹配扫描码,匹配重复标志)
匹配时根据控制位进行对应判断。控制位不表明的属性不参与匹配。
然后把各种按键的DFA组合成一个DFA,作为Filter的控制逻辑。
当一个键盘几乎所有的键都有对应功能的时候,这个很管用
比如我现在做的这航海桌面。
每个按键的长按短按都有一种功能。
通过这个Filter,就可以简单的把Event和Repeat组成的时间串,分解成互相没关联的事件。否还要记录状态,这十分麻烦。
下面 LS表示左键,RS表示右键,其他的都是字符按键。
这个看起来很漂亮。很多部分都一样,都是长按短按都识别,创建代码也会很简单。只有一个左键(LS)比较特殊,因为有短按长按识别还有组合键识别。
这里有个组合键,LS再RS。
通过引入超时事件就很容易处理。每次收到UP事件后就引入一个超时。如果超时了,那么这个匹配路径就被强制退栈。如果这个路径上有终结点,就返回最后一个终结点作为最后结果。
其实这也就是一个普通了不能再普通的连续按键判断逻辑用DFA画一边。
识别成功后怎么知道到底是匹配了那个路径?把记录堆栈扫描一下就行了。
终于不用再为这种东西烦恼了。
以后考虑加入用xml描述DFA,这样就可以录下操作,描述不同的行为。
定义
实现
使用Filter
- s60按键处理模型
- 按键通用程序处理模型
- S60 发送按键事件
- S60事件处理
- s60-DLL处理
- s60按键清单和视图对照
- s60按键清单和视图对照
- s60多媒体按键键的应用
- s60多媒体按键键的应用
- s60按键清单和视图对照
- 按键处理
- 按键处理
- 按键处理
- 按键处理
- s60 第二版 按键iscancode 检测小程序 源码
- s60平台下捕获全局按键的方法
- s60 3rd如何实现后台捕捉按键
- S60
- 一朝被蛇咬,十年怕井绳,一个老人在大街上突然摔倒,你会去扶吗?
- vc中使用免费界面换肤软件 USkin
- 演化模型(Evolutionary Model)
- DOS命令大全
- mini2440的bootloader制作
- s60按键处理模型
- 我所理解之“网络”
- 数据库设计中常见表结构的设计技巧
- 一个简单的注册c函数到python的包装器
- 结构型模式之五---Facade
- 无聊
- UrlReWriter 使用经验小结
- hard code & hard working & hard night
- 浅谈适配器设计模式与观察者设计模式