Skip to content

UI 库 :ime-ui 迁移对照

本文档整合所有 Java → v4 UI 层(:ime-ui)的迁移对比内容,涵盖 UI 层 class 迁移、View 系统迁移、输入面板迁移和配置界面迁移四个维度。

内容来源:170 §7.3、150 §2、400 §2/§8、920 §2/§7


1. UI 层 class 迁移

来源:170 §7.3

Java Classv4 对应变更说明
MainboardViewKeyboardPanel / KeyboardScreen两者均为完整输入法组件(含候选栏 / 输入栏 / 工具栏 + 键盘区域),叠加 / 全屏两种布局模式,合并原 ThreeLayerKeyboardAreaInputScreen 职责
KeyboardViewKeyGridPanel + GestureInputPanel + GestureFeedbackPanel三层分离替代单 View:按键渲染层 + 透明手势拦截层 + 透明反馈绘制层
KeyboardViewGestureListenerGestureDetectorLayerCompose Modifier.pointerInput 手势检测替代 View 手势监听
KeyboardViewKeyAnimatorKeyView(状态渲染)+ GestureFeedbackPanel(临时反馈)持续性状态与临时性反馈分离:KeyView 渲染按键常规状态(按下态、激活态、禁用态),GestureFeedbackPanel 绘制临时手势反馈(滑行轨迹、按键高亮)
CandidatesViewCandidateListPanelCompose LazyRow 替代 FlexboxLayout + 自定义分页
InputListViewInputListPanelCompose LazyRow 替代自定义 RecyclerView
InputListViewReadonly(已废弃)只读模式通过 ImeConfig 控制,无需单独 View
FavoriteboardViewFavoriteListPanelCompose LazyColumn 替代自定义 RecyclerView
InputQuickListViewCandidateListPanel(补全候选)功能合并到候选栏
XPadViewXPadView:ime-ui keyboard)Compose Canvas 重构,移除 Mixite 依赖
XPadStateGestureFeedbackState反馈状态管理重构,集成到三层面板架构
BaseThemedViewKeyboardThemeCompose 主题系统替代自定义 View 主题
BaseMsgListenerView(已废弃)MVI 模式下 View 不再监听消息,通过 StateFlow 自动更新

2. View 系统迁移

来源:400 §2 + §8

Java View 体系概览

组件Java 实现代码量复杂度v4 Compose 对应
KeyboardView自定义 RecyclerView + LayoutManager~800 行StandardKeyGridPanel + KeyView
InputListView自定义 RecyclerView + LayoutManager~600 行InputListPanel + LazyRow
CandidatesViewFlexboxLayout + 自定义分页~400 行CandidateListPanel + LazyRow
FavoriteboardView自定义 RecyclerView~300 行FavoriteListPanel + LazyColumn
XPadView自定义 Canvas 绘制~500 行XPadView + Compose Canvas
MainboardView组合容器~200 行KeyboardPanel / KeyboardScreen
InputboardView组合容器~150 行InputListPanel
ViewGestureDetector自定义手势检测~300 行Modifier.pointerInput
ViewGestureTrailer手势轨迹绘制~200 行GestureFeedbackPanel(TouchTrail 元素)
13 种 ViewHolder各类按键和输入的视图~1500 行KeyContent() / InputItem() 分支

Java 功能完整对照

Java UI 组件v4 Compose 对应变更说明
MainboardViewKeyboardPanel(叠加模式)/ KeyboardScreen(全屏模式)两者均为完整输入法组件(含候选栏 / 输入栏 / 工具栏),叠加 / 全屏两种布局模式,合并原 ThreeLayerKeyboardAreaInputScreen 职责
KeyboardView + KeyboardViewAdapterStandardKeyGridPanel + KeyView移除 Adapter/ViewHolder 模式
KeyboardViewLayoutManagerCompose Row/Column + Modifier.weight移除自定义 LayoutManager
KeyboardViewGestureListenerModifier.pointerInputCompose 手势 API
KeyboardViewKeyAnimatorCompose 动画 API声明式动画
12 种 KeyViewHolderKeyContent() 分支按类型分发 Composable,移除 ViewHolder 体系
InputListView + InputListViewAdapterInputListPanel + LazyRow简化
5 种 InputViewHolderInputItem() 分支按类型分发 Composable
InputQuickListViewQuickListPopup浮层
InputFavoriteListViewFavoritesList + LazyColumn简化
CandidatesViewCandidateListPanel + LazyRowFlexboxLayout → Compose
FavoriteboardViewFavoritesScreenCompose
XPadView + XPainter 系列XPadView + Compose Canvas统一绘制 API,移除 XPainter 体系
ViewGestureDetectorModifier.pointerInput标准手势 API
ViewGestureTrailerGestureFeedbackPanel(TouchTrail 元素)三层分离设计(详见 020-面板三层分离设计
ShadowDrawable / HexagonDrawableCompose drawBehind声明式绘制
AudioPlayerCompose LocalHapticFeedback + 音频扩展触觉反馈
DialogAlert / DialogConfirmCompose AlertDialog标准 Dialog
ToastCompose Snackbar标准反馈
HtmlTextViewAnnotatedString.appendHtml()Compose 原生 HTML
PreferencesSettingsScreenCompose 设置页
GuideMainScreenCompose + Navigation
12 个 About ActivityAboutScreen + Navigation单 Activity,移除 AlphaUserAgreement

View 与模型层交互对比

维度Java 版本v4 版本
数据流View → UserKeyMsgIMEditorViewIMEServiceIMEditorGestureInputPanelInputGestureImeEngine.handleGesture()
UI 更新IMEditorInputMsgIMEServiceIMEditorView → View 手动更新ImeEngine.state: StateFlow<ImeState> → Compose 自动重组
操作方式命令式:setVisibility()setText()setAdapter()声明式:状态驱动自动重组

历史原因:Java 版本使用传统 View 系统(自定义 View、RecyclerView、FlexboxLayout 等),每次 UI 更新都需要手动分发 InputMsg 并更新对应的 View。命令式操作大量 setVisibility()setText()setAdapter() 等,代码冗余且易出错。KeyboardView 作为自定义 RecyclerView 内嵌了 LayoutManager、Adapter、GestureListener 和 KeyAnimator,职责高度耦合。13 种 ViewHolder 代码量约 1500 行。v4 通过 Compose 声明式 UI 消除了手动更新逻辑,通过三层面板分离(020-面板三层分离设计)解耦了手势检测、按键渲染和视觉反馈。


3. 输入面板迁移

来源:150 §2

Java 版本中,按键的绘制、手势检测、手势反馈和输入处理高度耦合在 KeyboardView 及其相关组件中。v4 将其分离为三个独立层。

Java 版本耦合结构

组件耦合的职责v4 分离后
KeyboardView(RecyclerView)六边形网格布局 + ViewHolder 管理 + 手势检测 + 按键动画 + 滑行轨迹绘制拆分为三层:KeyGridPanel(渲染)+ GestureInputPanel(手势)+ GestureFeedbackPanel(反馈)
KeyboardViewLayoutManager六边形网格布局Compose Row/Column + Modifier.weight
KeyboardViewAdapterViewHolder 管理移除,Compose 条件分支替代
KeyboardViewGestureListener手势检测 + 按键查找 + 消息生成GestureDetectorLayerModifier.pointerInput
KeyboardViewKeyAnimator按键动画(状态反馈)KeyView(持续性状态)+ GestureFeedbackPanel(临时反馈)
RecyclerViewGestureTrailer滑行轨迹绘制(ItemDecoration)GestureFeedbackPanel(TouchTrail 元素)
XPadView(自定义 View)六边形绘制 + 区域高亮 + 手势检测 + 区域查找 + 状态管理XPadView(Canvas 绘制)+ GestureInputPanel(手势)+ GestureFeedbackPanel(XPadPathHighlight)

耦合问题与 v4 解决方案

Java 耦合问题说明v4 解决方案
手势检测与按键坐标绑定KeyboardViewGestureListener 通过 findVisibleKeyViewHolderUnderLoose() 查找触摸点下的 ViewHolder,手势检测依赖按键的实际布局位置GestureInputPanel 通过 keyPanelLayout.findKeyAt() 查询按键布局定位目标按键,与渲染层解耦
手势反馈与按键面板绑定RecyclerViewGestureTrailer 作为 ItemDecoration 绑定在 KeyboardView 上,轨迹绘制依赖按键面板的 CanvasGestureFeedbackPanel 是独立的透明绘制层,不依赖任何面板的 Canvas
按键状态反馈与按键渲染混合KeyboardViewKeyAnimator 既负责按键常规渲染又负责按下 / 激活等状态动画KeyView 仅渲染持续性状态,GestureFeedbackPanel 绘制临时手势反馈
X-Pad 手势、反馈与绘制不可分XPadView.onTouchEvent() 既检测手势区域又触发绘制更新手势由 GestureInputPanel 处理,反馈由 GestureFeedbackPanel 绘制,XPadView 仅渲染
无法支持分离布局输入手势、按键渲染和视觉反馈在同一组件中三层独立,可灵活组合叠加或分离布局
无法独立控制反馈反馈的显隐、样式、位置与按键面板生命周期绑定GestureFeedbackPanel 独立控制,支持多实例

三层面板架构

层级组件职责是否处理触摸是否绘制反馈
顶层GestureInputPanel透明手势拦截层,识别手势并输出 InputGesture✅ 唯一触摸接收者❌ 完全透明
中层GestureFeedbackPanel透明反馈绘制层,绘制滑行轨迹 / 按键高亮 / X-Pad 路径 / 手指指示器✅ 唯一反馈绘制者
底层KeyGridPanel按键渲染层,根据 ImeState 渲染按键布局和持续性状态❌ 仅渲染常规状态

历史原因:Java 版本的 KeyboardView 作为 RecyclerView 内嵌了 LayoutManager、Adapter、GestureListener 和 KeyAnimator,手势检测、按键渲染和视觉反馈高度耦合。XPadView 同样将绘制、手势和反馈合为一体。这种耦合导致无法将输入区域、按键区域和反馈区域放置在不同位置,无法独立控制反馈的显隐和样式,也无法支持分离布局模式。v4 通过三层面板分离(输入面板 / 反馈面板 / 按键面板)彻底解耦,每一层都可以独立地改变位置、大小和组合方式。


4. 配置界面迁移

来源:920 §2 + §7

Java 版本配置界面结构

分组配置项问题
基本主题设置(跳转子页面)、繁体优先分组混乱:主题与繁体优先不相关
隐私禁用输入数据记录、禁用按键弹出提示「禁用按键弹出提示」是反馈控制而非隐私
性能(默认折叠)禁用按键音效、禁用按键动画、禁用翻页音效、禁用手势轨迹「性能」分组名误导,关闭这些选项并非优化性能
关于致谢、关于、捐赠、反馈、团队、更新日志、软件服务协议、版权、Alpha 用户协议占据设置页一半空间

v4 配置界面分组对照

Java 分组v4 分组变更原因
基本 → 主题设置外观 → 主题模式扁平化,不再跳转子页面,即时预览
基本 → 繁体优先输入体验 → 繁体异体字优先功能本质是输入行为,非基本外观
隐私 → 禁用输入数据数据与隐私 → 记录输入习惯语义反转,更直觉
隐私 → 禁用按键弹出提示反馈控制 → 按键放大提示归入反馈控制,语义反转
性能 → 禁用按键音效等反馈控制 → 按键音效等语义反转;「性能」分组名误导
主题子页面 → 手模式外观 → 单手模式扁平化,最常用配置直达
主题子页面 → X-Pad输入体验 → X-Pad 连续输入功能本质是输入方式,非外观
关于 → Alpha 用户协议移除v4 不再有 alpha 变体

Java 功能完整对照

Java 配置 UIv4 对应变更说明
PreferenceFragmentCompatCompose SettingsScreen声明式,灵活布局
PreferenceScreen 跳转扁平化 LazyColumn减少页面跳转
SwitchPreferenceCompatEnhancedSwitchPreference增加描述、条件显示、依赖提示
ListPreference 主题选择ThemeSelector 卡片 + 即时预览可视化选择,内嵌键盘预览
ListPreference 手模式HandModeToggle 分段按钮一键切换,无需打开选择器
PreferenceCategory 固定分组expandableSection 可折叠分组低频配置默认折叠
否定式命名(禁用 xxx)肯定式命名(xxx 启用)直觉理解,UI 开关值 = config.ui.*Enabled
无描述每项完整描述说明功能和影响
无搜索SearchBar + 搜索索引快速定位配置
无键盘快捷入口QuickSettingsPopup输入中快速切换高频配置
无键盘预览KeyboardPreview 内嵌预览配置变更即时可视化
AboutDonate(微信 / 支付宝二维码)DonateScreen(Compose)保留捐赠入口,简化交互
Alpha 用户协议移除v4 无 alpha 变体
12 个 About ActivityAboutScreen + Navigation单 Activity 架构

配置字段命名对照

所有配置项从否定式(disable*)改为肯定式(*Enabled),UI 开关值直接映射:

Java 配置键(否定式)v4 ImeConfig.UiConfig 属性(肯定式)UI 显示名称映射关系
disable_key_clicked_audioaudioFeedbackEnabled按键音效直接映射(反转语义)
disable_key_animationkeyAnimationEnabled按键动画直接映射(反转语义)
disable_input_candidates_paging_audiocandidatesPagingAudioEnabled翻页提示音直接映射(反转语义)
disable_input_key_popup_tipskeyPopupTipsEnabled按键放大提示直接映射(反转语义)
disable_gesture_slipping_trailgestureSlippingTrailEnabled滑行轨迹显示直接映射(反转语义)
disable_input_clip_popup_tipsclipPopupTipsEnabled剪贴板粘贴提示直接映射(反转语义)
disable_user_input_datauserInputDataEnabled记录输入习惯直接映射(反转语义)
input_clip_popup_tips_timeoutclipPopupTipsTimeout剪贴板提示自动关闭直接映射
enable_x_input_padxPadEnabledX-Pad 连续输入直接映射
enable_latin_use_pinyin_keys_in_x_input_padlatinUsePinyinKeysInXPadEnabled拉丁键盘复用拼音布局直接映射
adapt_desktop_swipe_up_gestureadaptDesktopSwipeUpGesture适配桌面滑动手势直接映射
enable_candidate_variant_firstcandidateVariantFirstEnabled繁体异体字优先直接映射

历史原因:Java 版本的设置界面基于 PreferenceFragmentCompat,存在分组逻辑混乱(「基本」仅含主题和繁体优先两个不相关配置、「隐私」混入反馈控制项)、层级过深(主题和手模式藏在子页面中)、说明缺失(大部分开关只有标题没有描述)、命名否定式(所有开关用「禁用」前缀,用户需心理反转)等问题。v4 以用户心智模型为导向重新组织信息架构,使用场景化分组、肯定式命名、即时预览和搜索功能,显著提升了配置操作效率。