Skip to content

核心引擎

核心引擎负责输入法的数据模型、状态管理、消息传递和输入逻辑。这些类位于 core/ 包下,构成了输入法的领域核心。


1. 输入列表(InputList)

InputList 是输入法的核心数据结构,管理用户输入的字符序列和游标位置。

1.1 数据模型

说明
Input输入项基类,提供 isEmpty()confirm()copy()getText(Option) 等方法
CharInput字符输入,包含 Key 列表和可选的 InputWord 候选词绑定
GapInput间隙占位符,表示游标位置和插入点,始终为空
MathExprInput数学表达式输入,内嵌独立 InputList,内置计算器(调度场算法 → RPN 求值)
InputWord候选词基类,含 idvalueweight
PinyinWord拼音候选词,含 Spell(拼音发音)、Radical(偏旁部首)、variant(繁简变体)、traditional 标记
EmojiWordEmoji 候选词
InputClip剪贴板条目,含 type(文本类型)、code(唯一标识)、texthtml
InputFavorite用户收藏,含 idtypeshortcuttexthtmlcreatedAtusedAtusedCount

1.2 InputList 核心功能

功能说明
游标系统selected(当前输入引用)+ pending(待确认输入),通过 GapInput 间隙实现游标定位
待确认输入管理confirmPending()dropPending()newCharPending()newMathExprPending()
退格删除deleteBackward() — 处理 Gap 删除、拉丁逐字符删除、配对符号删除
输入选择select()selectLast()selectNextFirstMatched() — 在输入列表中导航
输入补全InputCompletions 支持 Latin(拉丁词补全)和 Phrase_Word(短语词补全)两种类型
间隙空格needGapSpace() — 在数学表达式、拉丁/非拉丁、数学运算符之间自动添加空格
文本输出getText(Option) — 带间隙空格插入的文本输出
拼音短语提取getPinyinPhraseWords()getPinyinPhraseWordsFrom()getPinyinPhraseInputWhichContains()
配对符号hasOnlyOnePairInputs()clearPairOnSelected() — 括号/引号成对输入与删除
撤销提交committedcleaned 阶段支持撤销操作

1.3 CharInput 拼音切换

方法说明
toggle_Pinyin_SCZ_Starting()s ↔ sh、c ↔ ch、z ↔ zh 平翘舌切换
toggle_Pinyin_NG_Ending()in ↔ ing、en ↔ eng、an ↔ ang 前后鼻音切换
toggle_Pinyin_NL_Starting()n ↔ l 鼻音切换

1.4 MathExprInput 计算器

  • 支持 +-×÷%、括号、小数点
  • = 等号触发计算,使用调度场算法(Shunting-yard)转换为逆波兰表达式(RPN)求值
  • 结果格式化为最多 4 位小数

1.5 InputTextType 文本类型识别

Favoriteboard 中通过正则表达式自动识别剪贴板文本类型:

类型正则匹配规则
text默认纯文本
htmlHTML 内容
urlURL 链接
captcha6-8 位纯数字验证码
phone手机号码
email电子邮箱
id_card身份证号
credit_card银行卡号
address地址信息

2. 键盘状态机

2.1 状态定义(State.Type)

状态说明
InputChars_Input_Wait_Doing等待输入(初始状态)
InputChars_Slip_Doing滑行输入进行中
InputChars_Flip_Doing翻转输入进行中(首字母快速滑行)
InputChars_XPad_Input_DoingX-Pad 环形输入模式
InputList_Commit_Option_Choose_Doing选择提交选项
InputCandidate_Choose_Doing候选词/符号/Emoji 选择
InputCandidate_Advance_Filter_Doing高级候选筛选
Editor_Edit_Doing编辑器光标/选择模式

2.2 状态数据

对应状态关键数据
InputCharsSlipStateDataSlipLevel 0/1/2 按键、level2NextChars
InputCharsFlipStateDataFlipstartChar(翻转起始字符)
InputListCommitOptionChooseStateDataCommit OptionInput.Option、hasSpell、hasVariant
PinyinCandidateChooseStateDataCandidatecandidates、pageSize、Filter、paging
PinyinCandidateFilterStateDataFilterPinyinWord.Filter
PinyinCandidateAdvanceFilterStateDataAdvance Filtercandidates、pageSize、Filter
EmojiChooseStateDataEmojiEmojis、groups、paging
SymbolChooseStateDataSymbolSymbolGroup、onlyPair、paging
EditorEditStateDataEditortarget(cursor/selection)、from point、motion
PagingStateData<T>分页基类pageSize、pageStart、totalSize

2.3 键盘类继承体系

Keyboard (接口)
 └─ BaseKeyboard (抽象)
     ├─ EditorEditKeyboard (抽象) — 光标定位与选择编辑
     │   ├─ PinyinKeyboard — 拼音输入(滑行/翻转/X-Pad)
     │   ├─ DirectInputKeyboard (抽象) — 直接输入到编辑器
     │   │   ├─ LatinKeyboard — 拉丁字母输入
     │   │   └─ NumberKeyboard — 纯数字输入
     │   ├─ InputCandidateKeyboard (抽象) — 候选选择与分页
     │   │   ├─ PinyinCandidateKeyboard — 汉字候选选择
     │   │   ├─ SymbolKeyboard — 标点符号选择
     │   │   └─ EmojiKeyboard — Emoji 选择
     │   ├─ MathKeyboard — 数学表达式输入
     │   └─ EditorKeyboard — 文本编辑操作
     └─ InputListCommitOptionKeyboard — 提交模式选项

2.4 BaseKeyboard 通用功能

功能方法
状态转换change_State_To()change_State_to_Init()change_State_to_Previous()
输入列表操作commit_InputList()revoke_Committed_InputList()backspace_InputList_or_Editor()delete_InputList_Selected()drop_InputList_Pending()confirm_InputList_Pending()
单字符输入start_Single_CharKey_Inputting() 含替换循环
输入补全do_InputList_Pending_Completion_Creating()
编辑器操作do_Editor_Editing()do_Editor_Cursor_Moving()do_Editor_Range_Selecting()
音频反馈play_SingleTick_InputAudio()play_DoubleTick_InputAudio()play_PageFlip_InputAudio()
弹出提示show_InputChars_Input_Popup()hide_InputChars_Input_Popup()

3. 消息体系

3.1 消息流架构

用户手势 → UserKeyMsg / UserInputMsg → Keyboard/Inputboard → InputMsg → UI 视图层

3.2 InputMsgType(37 种)

类别消息类型
音频InputAudio_Play_Doing
字符输入InputChars_Input_DoingInputChars_Input_DoneInputChars_Input_Popup_Show_DoingInputChars_Input_Popup_Hide_Doing
候选选择InputCandidate_Choose_DoingInputCandidate_Choose_Done
输入选择Input_Choose_DoingInput_Choose_DoneInput_Pending_Drop_DoneInput_Selected_Delete_Done
输入补全InputCompletion_Create_DoneInputCompletion_Apply_Done
输入列表InputList_Clean_DoneInputList_Cleaned_Cancel_DoneInputList_Commit_DoingInputList_Committed_Revoke_DoingInputList_PairSymbol_Commit_Doing
编辑器Editor_Cursor_Move_DoingEditor_Range_Select_DoingEditor_Edit_Doing
键盘Keyboard_State_Change_DoneKeyboard_HandMode_Switch_Doing/DoneKeyboard_Theme_Switch_DoneKeyboard_Switch_Doing/DoneKeyboard_Start_Doing/DoneKeyboard_Close_Doing/DoneKeyboard_Exit_DoneKeyboard_XPad_Simulation_Terminated
配置Config_Update_DoneIME_Switch_Doing
剪贴板InputClip_Create_DoneInputClip_Apply_DoneInputClip_Discard_DoneInputClip_CanBe_FavoriteInputClip_Text_Commit_Doing
收藏InputFavorite_Query_Doing/DoneInputFavorite_Paste_DoneInputFavorite_Delete_DoneInputFavorite_Clear_All_DoneInputFavorite_Save_DoneInputFavorite_Text_Commit_Doing

3.3 UserKeyMsgType(12 种)

类型说明
Press_Key_Start/Stop按键按下/松开
LongPress_Key_Start/Tick/Stop长按开始/连续触发/结束
SingleTap_Key单击按键
DoubleTap_Key双击按键
FingerMoving_Start/Moving/Stop滑行开始/移动中/结束
FingerFlipping翻转手势(快速滑行)

3.4 UserInputMsgType(14 种)

类型说明
SingleTap_Input点击输入列表中的项
SingleTap_InputCompletion点击补全建议
SingleTap_InputClip点击剪贴板条目
SingleTap_Btn_Clean_InputList清空输入列表
SingleTap_Btn_Cancel_Clean_InputList撤销清空
SingleTap_Btn_Editor_Action编辑器操作按钮
SingleTap_Btn_Close_Keyboard关闭键盘
SingleTap_Btn_Open/Close_Favoriteboard打开/关闭收藏面板
SingleTap_Btn_Select_InputFavorite选择收藏项
SingleTap_Btn_Paste_InputFavorite粘贴收藏项
SingleTap_Btn_Delete_Selected_InputFavorite删除选中收藏
SingleTap_Btn_Clear_All_InputFavorite清空所有收藏
SingleTap_Btn_Save_As_Favorite保存为收藏

4. 按键模型

4.1 按键类型体系

说明核心字段/方法
Key按键基类(只读,Builder 模式,可缓存)valuelabeliconcolordisabled;内部类 Key.ColorKey.IconKey.Style
CharKey可输入字符键Type 枚举:Alphabet/Number/Symbol/Emoji;Level 枚举:level_0/1/2/final;替换循环 replacementsnextReplacement()
CtrlKey控制功能键Type 枚举(28 种);PinyinToggleModeInputWordCommitMode;泛型 Option<T>
SymbolKey标点符号键包装 dict/Symbol
MathOpKey数学运算键Type 枚举:Equal/Plus/Minus/Multiply/Divide/Percent/Permill/Permyriad/Brackets/Dot
InputWordKey候选词键InputWord word 字段
XPadKeyX-Pad 复合键三区域:zone_0_key(光标定位)、zone_1_keys(键盘切换)、zone_2_keys(字符输入)

4.2 CtrlKey.Type(28 种控制键)

类别控制键
基本NoOp、Space、Backspace、Enter、Exit
输入Commit_InputList、Commit_InputList_Option、DropInput、ConfirmInput、RevokeInput
拼音Toggle_Pinyin_Spell、Filter_PinyinCandidate_advance、Filter_PinyinCandidate_by_Spell、Filter_PinyinCandidate_by_Radical、Confirm_PinyinCandidate_Filter
编辑器Editor_Cursor_Locator、Editor_Range_Selector、Edit_Editor
切换Switch_HandMode、Switch_Keyboard、Toggle_Emoji_Group、Toggle_Symbol_Group
X-PadXPad_Active_Block、XPad_Char_Key、XPad_Simulation_Terminated

4.3 InputWordCommitMode 提交模式

模式说明
only_pinyin仅提交拼音
with_pinyin拼音跟随提交
simple_to_trad简体转繁体提交
trad_to_simple繁体转简体提交

5. X-Pad 核心模型

5.1 XPadKey 三区域结构

区域内容说明
zone_0光标定位器(1 个 CtrlKey)中心六边形,双击切换到 Editor 键盘,长按开始选择编辑
zone_1键盘切换器(6 个 CtrlKey)内环:Latin/Pinyin/Number/Math 等键盘切换
zone_2字符输入区(6 × 2 个 CharKey)外环:按拼音 Level 分层排列字符

5.2 X-Pad 手势交互

  • 在外环区域滑行触发字符输入,按 Level(level_0 → level_1 → level_2)逐级推进
  • 在内环区域点击切换键盘类型
  • 在中心区域双击进入编辑器,长按启动选择模式
  • 支持左手模式(区域镜像翻转)
  • 支持模拟模式(练习引导中自动演示)

6. Inputboard 与 Favoriteboard

6.1 Inputboard(输入面板)

管理 InputListUserInputMsg 消息的交互:

功能说明
提交commit_InputList() — 提交输入列表文本到编辑器
撤销提交revoke_Committed_InputList() — 撤销最近一次提交
清空/撤销清空InputList_Clean_Done / InputList_Cleaned_Cancel_Done
输入选择点击输入列表中的 Gap 或 CharInput
补全应用点击输入补全建议

6.2 Favoriteboard(收藏面板)

剪贴板监控与收藏管理:

功能说明
剪贴板监控注册 ClipboardManager.OnPrimaryClipChangedListener,自动检测新剪贴内容
智能文本识别正则匹配验证码、URL、手机号、邮箱、身份证、银行卡、地址
收藏 CRUD保存、粘贴、删除、清空
使用统计usedAtusedCount 追踪使用频率和时间
收藏转换InputFavorite.from(InputClip) — 剪贴板条目转收藏