awtk/docs/input_method.md
2018-09-11 16:05:58 +08:00

103 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 输入法
输入法是GUI重要的组件之一虽然实现起来并不是太复杂但其涉及的组件比较多理解起来还是比较困难的这里介绍一下AWTK中输入法的内部架构。
![overview](images/input_method_overview.png)
## 一、软键盘
在嵌入式系统中通常没有物理键盘所以需要在屏幕上实现软键盘。AWTK中的软键盘是一个普通的窗口其中的按钮和候选字控件都是用AWTK的UI描述文件定义的可以方便实现各种不同的软键盘。软键盘的描述文件放在res/raw/ui目录下文件名以kb_打头。
与普通窗口相比,软键盘有以下不同:
* 被点击时不会影响原有编辑器的焦点。
* 不接受按键事件和输入文本事件。
为了实现方便AWTK中引入了一个keyboard的窗口类在设计时考虑了下面几个问题
* 1.软键盘上有多个页面。有的输入中文,有的输入大写字母,有的输入小写字母,有的输入数字,有的输入符号。
**方案:** 在软键盘中可以放多个页面,点击切按钮时进行切换。按钮的名字以"page:"开头,即意味着按下该按钮时切换到指定的页面。比如,下面的按钮被点击时就会切换到数字符号键盘:
```
<button name="page:symnum" style="1:highlight" w="15%" text="123"/>
```
* 2.不同的编辑器需要不同的软键盘。比如输入数值的编辑器得到焦点时,就应该只显示输入数值的软键盘。
**方案:** 为不同输入类型的编辑器提供不同软键盘这些软键盘有各自的UI描述文件。输入类型和UI描述文件名之间的对应关系如下
| 输入类型 | 键盘描述文件 | 说明 |
|----------|:-------------:|------:|
| INPUT_PHONE | kb_phone | 电话号码|
| INPUT_INT | kb_int | 整数 |
| INPUT_FLOAT | kb_float | 浮点数|
| INPUT_UINT | kb_uint | 非负整数 |
| INPUT_UFLOAT | kb_ufloat | 非负浮点数|
| INPUT_HEX | kb_hex | 16进制 |
| INPUT_EMAIL | kb_ascii |邮件地址|
| INPUT_PASSWORD | kb_ascii |密码|
| 其它 | kb_default ||
> 参考input\_methods/input\_method\_default.c
* 3.软键盘上的按钮存在多种功能。有点用于切换软键盘上页面,有的用于输入文本,有的提交按键给输入法引擎进一步处理,有的用于删除最后输入的字符。
**方案:** 通过按钮的名字决定其功能:
| 按钮名称 | 功能说明 |
|----------|:-------------:|
| space | 输入空格|
| backspace | 删除最后输入的字符|
| key:开头 | 按键。需要交给输入法引擎进一步处理|
| page:开头 |切换页面|
| 其它 |直接提交该文本到编辑器|
* 4.有时需要显示候选字有时不需要。
**方案:** 提供一个候选字控件,可以根据需要加入到软键盘描述文件中。
> 参考res/raw/ui/kb_default.xml
## 二、输入法接口及实现
AWTK作为一个通用的GUI需要考虑以下几种情况
* 1.不需要输入法。
* 2.低端嵌入式设备没有资源启用输入法。
* 3.手机/PC有原生的输入法不需要AWTK提供一套输入法。
* 4.在中高端嵌入式设备中,有资源启用输入法而且需要输入法。
针对上面几种情况AWTK提供了三种不同的实现可以根据需要加入对应的实现
![input method](images/input_method.png)
* null实现只是提供了空的实现不启用输入法和软键盘。
* sdl实现包装了原生输入法(SDL的实现有些问题还需要进一步完善)。
* default提供了自己的实现负责软键盘的打开关闭和输入法引擎的创建。
## 三、输入法引擎及实现
输入法引擎主要负责将用户的按键转换成一组候选字(这些候选字将在软键盘上的候选字控件上显示出来)。输入法引擎有很多不同的语言也有不同的输入法引擎目前AWTK只提供了拼音输入法(基于google拼音)和一种null的实现用户可以实现自己的输入法引擎第三方开发者也可以集成自己的输入法引擎到AWTK中。
![](images/input_engine.png)
## 四、编辑器
编辑器只需要在得到焦点或失去焦点时,请求输入法打开或关闭输入法即可。
## 五、联想功能(因为目前没有数据,暂未实现)
联想功能实现比较简单,在用户点击候选字时,根据当前的选择提供一组新的候选字即可。
## 六、其它
目前AWTK的基本功能可用了但易用性方面还需持续完善比如
* 软键盘的按钮被点击时需要放大显示。
* 候选字控件的展开和折叠。
* 预编辑功能。
由于事情很多,上面的问题对架构影响不大,暂时先放一放。