Skip to content

菜单栏图标状态

作者:steipete · 更新:2025-12-06 · 范围:macOS 应用(apps/macos

  • 空闲(Idle):正常图标动画(眨眼、偶尔摇摆)。
  • 暂停(Paused):状态项启用 appearsDisabled,无任何动效。
  • 语音触发(大耳朵):检测到唤醒词后,语音唤醒检测器调用 AppState.triggerVoiceEars(ttl: nil),在捕捉语音期间保持 earBoostActive=true。耳朵缩放到 1.9 倍,出现圆形耳孔以提升辨识度,沉默 1 秒后通过 stopVoiceEars() 恢复原状。该状态只由应用内语音流水线触发。
  • 工作中(Agent 运行中)AppState.isWorking=true 触发"尾巴/腿部快速抖动"微动效:腿部抖动加速并轻微偏移,表示任务正在进行。目前已在 WebChat Agent 调用时切换此状态,在接入其他长任务时同样需要加上切换。

接入点

你的小龙虾正在处理任务时,图标会跟着"动起来"——接入方法如下:

  • 语音唤醒:运行时/测试器在触发时调用 AppState.triggerVoiceEars(ttl: nil),沉默 1 秒后调用 stopVoiceEars(),与捕捉窗口保持一致。
  • Agent 活动:在工作时间段前后调用 AppStateStore.shared.setWorking(true/false)(WebChat agent 调用中已实现)。时间段保持短小,并在 defer 块中重置,避免动画卡死。

形状与尺寸

  • 基础图标由 CritterIconRenderer.makeIcon(blink:legWiggle:earWiggle:earScale:earHoles:) 绘制。
  • 耳朵缩放默认为 1.0;语音激活时设置 earScale=1.9 并开启 earHoles=true,不改变整体画框(18×18 pt 模板图像渲染到 36×36 px Retina 后备存储)。
  • "快速抖动"使用腿部摆幅最大约 1.0 加小幅水平晃动,叠加在任何已有的空闲摆动上。

行为注意事项

  • 没有外部 CLI/broker 接口来切换耳朵/工作状态;保持它只响应应用自身的信号,避免意外抖动。
  • TTL 尽量短(<10s),确保任务挂起时图标能快速恢复到基准状态。