Skip to content

[ui] 听写快速连按应在上一轮完全结束前忽略激活(动画已缓解,逻辑未改) #545

@HKLHaoBin

Description

@HKLHaoBin

现象

期望逻辑

Toggle 模式下快速连按时,按键语义应为:

按键次序 用户意图 期望行为
第 1 次 开始听写 ✅ 激活
第 2 次 结束听写 ✅ 关闭
第 3 次(上一轮尚未完全结束 误触 / 补按 忽略(不得再次 begin_session
下一次(上一轮已完全结束后) 新一轮听写 ✅ 激活

即:「激活 → 关闭 → 忽略(直至结束)→ 激活」,而非 「激活 → 关闭 → 激活」

「完全结束」= 听写会话收尾 胶囊 UI 生命周期结束(见下),不能仅以 coordinator 进入 SessionPhase::Idle 为准。


历史表现(Issue 初报时,约 v1.3.4-13 及更早)

  • 快速连按会触发胶囊 收起(capsule-out)再弹出(capsule-in,动画反复播放,视觉抖动严重。
  • 根因之一:SessionPhaseIdle,但 Capsule.tsx 仍在 leaving 离场动画(约 EXIT_ANIM_MS 360ms)期间,第三次按键被 handle_pressed 当作新激活(dictation.rsIdlebegin_session)。

升级后表现(v1.3.4-14-beta 实测,2026-05-28)

用户升级至最新版本后复测,动画层面的「收起再弹出」已基本消失,但业务逻辑未变

  1. 胶囊会一直显示,不再明显经历「缩回去再弹出来」的循环动画。
  2. 内容仍会随反复激活切换(听写状态/文案随连按变化),说明后端仍在处理本应在「未完全结束前」忽略的按键。
  3. 推测与 PR fix(v1.3.1-5): 胶囊动画 + Qwen3 灰显 + 5 SVG 重画 + 6 项 Windows 视觉修复 + polish 反降级 #423Capsule.tsx 引入 leaving + lastVisibleState)及后续行为有关:期间若 state 再次变为非 idle,会中止离场动画并恢复显示(代码注释:「若期间 state 又切回非 idle(例如用户连按热键),立刻中止 leaving 并恢复显示」)——这缓解了动画闪烁,但不等于在 coordinator 层忽略第三次及以后的激活请求。

结论:近期改动解决的是 UI 动画问题,与本 Issue 要求的「激活未完全结束前忽略热键」不冲突;动画优化可保留,仍需补齐激活互斥 / busy gate。


证据

影响

  • 用户以为已关闭听写,补按仍会重新进入听写流程(只是不再闪动画),与「关闭后应冷却一段时间才能再开」的预期不符。
  • 卡顿后连续补按仍会积压并执行多次激活/关闭,状态与胶囊文案连跳,难以判断当前是否在录音。
  • 动画修复降低了视觉干扰,但未消除误操作带来的功能层反复激活

建议接受标准

  • 三连按语义(Toggle):第 1 激活;第 2 关闭;第 3 次若上一轮尚未完全结束忽略(无 begin_session、无新的听写会话),与是否播放收起动画无关。
  • 完全结束后才允许再激活:胶囊 UI 与 coordinator 均进入维护者定义的「可接受下一次激活」边界后,下一次按键才计为新激活。
  • 与动画修复不冲突:保留现有「避免反复收起/弹出」的 UI 行为;在此基础上增加 coordinator 层(或前后端统一的 busy gate) 忽略无效激活。
  • 关闭/取消路径可用:第 2 次关闭、Hold 松开、Esc 取消等正常结束路径不受影响。
  • 回归:单次 Toggle、Starting pending_stopfix: Starting 阶段忽略热键边沿 — hold 快速松开 / toggle 快速双击会卡死会话 #51)、Hold 模式不受影响。

TODO / 不确定项

  • 请维护者确认 v1.3.4-14 中具体合入了哪些与胶囊/热键相关的 PR,并在实现互斥时标明与动画修复的分工边界。
  • 「完全结束」的权威信号:前端回传、capsule_busy 标志,或延长 Idle 判定条件——由维护者选定。
  • Hold / 组合键 / CLI --toggle-dictation 是否适用同一忽略规则。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions