用途
该技能面向屏幕录制(screen recording)的画面推近(zoom)处理,为面板中的屏幕画面提供统一的缩放规范,包括缩放倍数、渐变爬升、时间节奏、焦点钳制、可读性规则,以及决定哪些动作需要推近的规划器。资料将该规范称为“house zoom”。
主要能力
基础参数
- 静止(Rest):内容列填满面板宽度。
- 峰值(Peak):静止的 1.33 倍,绝不超过静止的 1.5 倍;如果结果画面大部分为白色(例如白卡片上的 logo),则使用 1.1 倍。
- 爬升(Ramp):用时 1.0 秒进入;在同一个步骤内不缩小——下一步是一个新面板。
- 缩小(Zoom out):关闭。对于在同一个屏幕上停留数分钟的素材(下一步推近不是新面板),zoomOut 沿同一条曲线回到静止,并且每个焦点都持续到其保持结束、爬升开始时(until)。
- 文本下限(Text floor):关闭。textFloor 以帧像素为单位:峰值会升高,直到 UI 文本至少达到该高度;如有必要可超过 1.33 倍,但仍不得超过推近所允许的焦点框裁切范围。
- 缓动(Easing):cubic-bezier(0.16, 1, 0.3, 1),起步快、收敛长。
- 起点(Start):针对一个结果时,在测量到的揭示之后 0.1 秒开始(结果先出现,然后画面再推近);针对一次点击时,在点击前 0.5 秒开始(delay: -0.5),让点击落在已稳定的画面上。
- 合并(Merge):2.5 秒内的两个焦点事件共享一次推近:在检查平移能否放进该步骤之前,先选择它们共同的峰值。
关键帧与脚本
揭示时间是测量得到的,绝不估算:每个揭示的稳定时间按 screen-recording-analysis 技能的规定获取。在录制层上作为关键帧(t 相对于该层,timeMode: "layer"),裁剪从揭示前 1 秒开始:
- t = 0:scale = rest,position = rest framing,easing: "linear"(等待状态,保持)。
- t = 1.1:scale = rest,position = rest framing,easing: cubic_bezier(揭示 + 0.1)。
- t = 2.1:scale = peak,position = peak framing(终态:无缓动)。
运行 scripts/zoom.py 生成关键帧,绝不手工推算。将录制的尺寸、其面板、内容列、层长度以及每个要推近的结果(其以层秒为单位的测量揭示时间、其边界框、其平均亮度,以及它所在的卡片(如有))写入一个文件,并从本技能文件夹运行 python3 scripts/zoom.py <file>。它会打印该层的缩放和位置关键帧及其缓动、UI 文本在静止时的高度,以及因步骤剩余太少而不得不跳过的推近。其 docstring 列出了每个字段,options 设置 zoom out 和文本下限。当每个步骤都获得新面板时,将两者都关闭。上表与上例说明了它的行为,适用于无法运行它的宿主。
缓动规则
场景关键帧精确采用该曲线:easing: { kind: "cubic_bezier", control: [0.16, 1, 0.3, 1] }。关键帧的缓动塑造从它开始的那一段,因此将曲线放在每一段爬升开始的关键帧上,并显式将保持段起始关键帧标记为 easing: "linear"——没有缓动的关键帧会触发 linear_easing_by_omission 警告。终态关键帧不带缓动(否则触发 unused_easing_on_terminal_keyframe)。
焦点与可读性
- 保持焦点在面板内:钳制取景,使缩放后的窗口保持在录制画面内;宁可让焦点偏离中心,也不显示面板的空白边缘。静止和峰值取景使用 screen-recording-layouts 技能中的取景公式;zoom.py 会对两者做钳制并应用该公式。峰值若被限制为不高于静止,则保持静止的精确缩放,即使这超过了焦点裁切上限;其缩放永不低于覆盖面板所需的最小值。
- 可读优先于美观:如果面板中 UI 文本不可读,请收紧面板取景或剪掉该步骤;绝不要在没人能读的文本上交付推近,也绝不要通过加大缩放来修复可读性。文本下限不是这种修复手段:它设定的是在整个屏幕清晰但绘制得过小时推近可以推进的程度,并且像任何推近一样受限。模糊的静帧在任何峰值下都仍然模糊。screen-recording-layouts 技能的 readability.py 在构建前测量可读性;screen-ui-redesign 技能会重绘无法取景到可读的步骤。
长录制的推近规划
自行决定推近的构建器会自己决定其推近;保留它们。当你自己放置推近时,对于停留在同一个屏幕上有许多点击的素材(用户编辑过的屏幕、没有构建器覆盖的录制),让 scripts/zoom_plan.py 决定哪些动作获得推近:
- 推近到被揭示的内容,而不是点击本身:变化区域的边界框,加上填充。
- 宽变化不推近:比静止视图的宽度或高度大 60% 以上的框不获得推近。
- 绝不超过 1:1:推近在录制画面会被绘制得大于其自身像素的地方停止。不大于帧的录制没有空间,计划会说明(would_upscale)。
- 相近的动作共享一次推近,保持住,从一个平移到下一个。丢弃填充窗口无法覆盖视图的事件为 no_gain,然后分组。绝不回到静止不足 1 秒:两个如此接近的推近合并为一个。
- 让点击提前 0.3-1.0 秒,使其落在已稳定的画面上;在变化后 0.1 秒跟随,如上所述。一旦最后一个动作进入画面,保持约 1.8 秒,然后以比进入更慢的速度缩小。
- 单一旋钮 intensity:subtle、balanced(house 数值)或 punchy。它一起设置峰值、合并间隔、提前量和爬升。说明你用了哪一个;用户用一个词更改它。
从本技能文件夹运行 python3 scripts/zoom_plan.py <file>,输入录制的尺寸、层的长度、它静止所在的视图(其面板或帧)以及每个测量到的点击或变化(按 screen-recording-analysis 技能的读取方式)。它会打印它规划的缩放、它丢弃的事件及原因,以及作为 zoom.py 输入的 foci 和 options:添加面板和内容列,并运行 zoom.py 生成关键帧。该计划是一个提案:在用户审阅时说出它的推近;用户放弃的推近在你再次规划时保持放弃。