Skip to content

feat/fix/perf: 字体加载、数字键盘/语音/导航、主题/按键音/候选/设置改进 - #53

Open
SandyYuR wants to merge 13 commits into
fxliang:fxfrom
SandyYuR:pr/fx2-integrated
Open

feat/fix/perf: 字体加载、数字键盘/语音/导航、主题/按键音/候选/设置改进#53
SandyYuR wants to merge 13 commits into
fxliang:fxfrom
SandyYuR:pr/fx2-integrated

Conversation

@SandyYuR

@SandyYuR SandyYuR commented Aug 29, 2026

Copy link
Copy Markdown

概述

本 PR 汇总 fx2 分支领先 fx 分支的改动,按类型整理后共 13 个提交(未包含仅适用于本 fork 的 webeditor Pages 改动)。

改动内容

字体(perf / feat)

  • 并行预加载字体,降低键盘启动延迟;修正异步加载期间字号取值被临时空表污染的问题
  • 修复重载窗口期切换布局导致自定义字体整体回退系统默认字体的问题(原子替换 + 数据版本号)
  • 配置读取与字体文件加载增加有界重试;读取失败时保留上一套已服务字体,避免闪回系统默认字体
  • 候选注释(comment)支持独立字体与字号设置(默认 14sp),水平/展开/浮动候选窗均生效

数字键盘(fix / refactor)

  • 数字布局手动覆盖及输入法切换时的正确释放;输入框 restarting 重启保留数字盘,新增 KeyboardInputLifecycleTracker 单元测试
  • 未知 LayoutSwitchKey 目标 / NumPadKey 符号在编辑器中保留,不再被丢弃
  • 语音输入结束后恢复会话前的键盘布局,同输入框重启时保留布局快照
  • TextKeyboard 布局状态改为每实例持有,修复构造期问题并让预览/设置一致

主题(feat / fix)

  • Monet 编辑器支持一键重置配色映射,并修正按压键高亮颜色
  • 取色器调整 HSV 时不再产生隐形颜色(全透明色)
  • 新增亮/暗主题一键切换按钮(点击切换,长按直达主题设置)

设置(fix)

  • 设置界面退出保存时跳过 Rime 用户数据同步,避免 rime 全量重新部署;完整保存仍用于关机/导出
  • 修复设置页重建时路由参数崩溃:路由参数改为从 Fragment 自身 arguments 解码

按键音(feat)

  • 支持导入并选择自定义按键音;SoundPool 加载完成后才发声,失败自动回退系统按键音

候选(feat)

  • 新增「默认高亮第一个候选」开关(默认关闭,保持原行为)

测试

  • 新增 KeyboardInputLifecycleTrackerTest,覆盖输入会话重启与 IME 身份变化(单元测试不进发布版 APK)

Commits

  • fe913b2 perf(input): 并行预加载字体并修正异步加载后的取值
  • 64db2fb fix(keyboard): 数字布局手动覆盖及输入法切换时的正确释放
  • c3a817e fix(editor): 未知 LayoutSwitchKey 目标 / NumPadKey 符号在编辑器中保留
  • d3be2a4 feat(action): 新增亮/暗主题一键切换按钮
  • d3cac25 feat: 支持导入并选择自定义按键音
  • f172c1f feat(candidate): 新增「默认高亮第一个候选」开关
  • 7ef7549 feat(theme): 支持重置 Monet 配色映射并修正按压键高亮颜色
  • 8ee2532 feat(font): 候选注释(comment)支持独立字体与字号设置(qiuminal)
  • 05f8dc5 fix(navigation): 修复设置页重建时路由参数崩溃
  • df8372b fix(theme): 取色器调整 HSV 时不再产生隐形颜色
  • a83422d refactor(keyboard): TextKeyboard 布局状态改为每实例持有并修复构造期问题
  • 9e4f67d fix(keyboard): 语音输入结束后恢复会话前的键盘布局
  • 114c48f fix: 设置界面退出保存时跳过 Rime 同步

@SandyYuR
SandyYuR marked this pull request as ready for review August 29, 2026 12:42
@SandyYuR
SandyYuR marked this pull request as draft August 29, 2026 14:36
@SandyYuR SandyYuR changed the title feat/fix/perf: 字体加载优化、数字键盘生命周期修复、Kawaii/主题/按键音/候选改进 feat/fix/perf: 字体加载优化、数字键盘生命周期修复、主题/按键音/候选改进 Aug 30, 2026
@SandyYuR
SandyYuR marked this pull request as ready for review August 30, 2026 03:05
@SandyYuR
SandyYuR marked this pull request as draft August 30, 2026 08:35
@SandyYuR
SandyYuR marked this pull request as ready for review August 31, 2026 08:35
SandyYuR and others added 13 commits September 1, 2026 17:16
加大并行字体加载并协调 provider 就绪时机,降低键盘启动延迟;键盘刷新延后到新字体缓存就绪后再执行,并以 token 防止过期回调串扰。
同时修正预加载正确性:默认 provider 异步载入期间可能以临时空表算出字号回退值并写入结果缓存,掩盖用户配置值——现仅在 sizeMap 非空时写入缓存。

- 预加载复用单线程执行器,不再每次创建新线程
- clearCache() 后正在进行的加载会提前中止,不继续读取剩余字体文件
在键盘与编辑器状态变化间保留手动数字布局覆盖:NumericLayoutOverrideController 记住 manualKey 供 force() 回落复用,编辑器状态变化不再丢失数字布局设置。

修复 IME/语言切换的回归:onImeUpdate 经 clearForcedLayoutKey 清除层锁存时会回落到先前记住的 manualKey,把新输入法强制压回数字盘(如"中英切换后落在数字区")。现于 onImeUpdate 开头仅清除手动槽位记忆,会话级(数字编辑框)覆盖不受影响,ABC 键显式退出语义不变。

新增 KeyboardInputLifecycleTracker 及单元测试:区分真实输入法/submode 变化与 focus 重启产生的重复事件,重复事件不再误释放手动数字布局。
自定义布局中的 LayoutSwitchKey 可能引用预设选项之外的布局键,NumPadKey 也可能使用预设列表之外的 keysym。此前编辑器按 selectedItemPosition 取预设列表,未知值会被静默替换成第一个选项,再次保存时丢失配置。

现在 spinner 会把当前值作为额外选项保留:SwitchTargetOption 支持无 label 时直接显示 value,NumPadOption 覆写 toString 显示 label,未知值不再丢失。
ThemeManager 新增当前是否为已配置暗色主题的判断与一键日/夜切换(切换后自动停用跟随系统,IME 重建后仍生效)。
ButtonAction 注册 theme_toggle 动作:点击在已配置的亮/暗主题间切换,长按打开主题设置页;并加入可选动作与默认列表,替换原收尾项。新图标 ic_theme_light_dark_24 与字符串(含 zh-rCN:"亮色/暗色主题")随此提交加入。
支持导入、选择、持久化并对用户提供的按键音文件进行一致性排序(InputFeedbacks / AppPrefs / UserConfigFiles / 键盘设置界面均接入)。

播放改用 SoundPool,等待 onLoadComplete 完成后才发声:未就绪或加载失败时清理资源、回退系统按键音,避免无声或出错;相关字段加 @volatile 保证跨线程可见性。
候选栏默认不高亮候选,只有按空格切换候选后高亮才出现;参考 boomker 分支,
候选栏会在未移动选择时就高亮第一个(默认选中)候选项。现将该行为做成可选设置:

- AppPrefs 新增 highlight_first_candidate 偏好项,默认关闭(保持原行为)
- HorizontalCandidateComponent 分页/非分页候选事件均根据开关决定初始高亮索引
- KeyboardGroupFragment 将开关归入「工具栏与候选栏」分组
- 新增 8 种语言文案(中/英/繁/德/西/日/韩/俄)
Monet 编辑器新增"重置主题颜色"入口(reset_theme_colors),一键恢复默认配色映射。

同时修正 Monet 颜色下按压键高亮直接取映射色的错误表现——现按明暗模式附加透明度(暗色 0.2 / 亮色 0.12),按压反馈与标签可读性恢复正常。
候选栏及候选窗展示的注释(如中州韵的注音/形码拆分)原先与候选词共用
cand_font 及字号。注释通常比候选词更长,按大厂输入法习惯应使用更小
的字号与更易读的字体。新增 fontset 条目 comment_font / comment_font_size:

- FontsetEditorActivity 增加 Comment Font 设置项,默认 14sp
- CandidateItemUi / LabeledCandidateItemUi 用 TypefaceSpan + AbsoluteSizeSpan
  仅为 comment 段应用独立字体与字号,候选词部分不受影响
- 新增 CustomTypefaceSpan 以兼容所有 API 级别
- 水平候选栏、展开候选窗、浮动候选窗均生效
- 新增 FontProviders.resolveCommentTypeface / commentFontSizePx 帮助函数,
  统一 5 处重复的注释字体解析与字号换算
透明预设里的颜色(如 keyboardColor、keyShadowColor 默认为 0x00000000)在取色器
中调整色相/饱和度/明度时会一直沿用 alpha=0,预览和实际效果都看不到任何变化,
表现为"怎么调都调不出颜色"。

新增 ThemeColorEditorAlphaState 记录用户是否显式设置过透明度:未显式设置且当前
alpha 为 0 时,HSV 编辑按不透明处理;一旦用户拖动过透明度滑条或手输过 ARGB,就
完全保留其选择(包括故意设置的全透明)。程序化回填 ARGB 输入框不会被误判为用户
编辑。CustomThemeActivity 的内嵌取色器与独立的 ThemeColorEditorActivity 均已接入。

参考 boomker/fcitx5-android@a786eaf
TextKeyboard 布局状态由共享改为每实例持有,避免多实例串扰:
- 新增 TextKeyboardLayoutState 并修复其 JVM 签名冲突
- 修复 TextKeyboard 构造期读取布局状态导致点击输入框崩溃
- 加固构造期单槽位,并同步 attach 播种顺序
- 新增 isPreview 标记:设置预览键盘不再接收数字覆盖
  (setForcedLayoutKey / setNumericLayoutKey / dismiss / restore)广播,
  布局文件变更刷新仍然覆盖预览
语音输入会话结束后恢复会话前的键盘布局;同输入框重启时保留语音布局快照,
不因重启清空用户当前看到的布局。
保留设置界面退出时的兜底保存,避免非 Fragment 配置在离开页面时丢失。

新增选择性保存入口,继续保存输入法配置和非 Rime 插件状态,但跳过 Rime 的用户数据同步。

完整保存逻辑保持不变,关机和导出用户数据仍会保存所有插件状态。
@SandyYuR SandyYuR changed the title feat/fix/perf: 字体加载优化、数字键盘生命周期修复、主题/按键音/候选改进 feat/fix/perf: 字体加载、数字键盘/语音/导航、主题/按键音/候选/设置改进 Sep 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants