回放流程
回放页是 BlinkLife 最复杂的页面,负责视频回放、三层时间轴交互、高光事件浏览/编辑/删除、剪辑触发,支持横版和竖版视频两种布局模式。
用户旅程
录制结束 ──┐
首页卡片 ──┤
历史记录 ──┼──→ 回放页 ──→ 剪辑列表 / 首页
外部导入 ──┘
页面入口
| 入口 | 来源页面 | 携带参数 |
|---|---|---|
| 录制结束跳转 | RecordingPage | RecordingRecord, fromRecording=true |
| 首页卡片点击 | HomePage | RecordingRecord |
| 历史记录条目 | HistoryPage | RecordingRecord |
| 外部导入完成 | ExternalClipPage | RecordingRecord (pushReplacement) |
页面布局
横版视频
┌──────────────────────────┐
│ 视频播放器 │ ← 宽度 96%,圆角 12
│ (操作栏 overlay) │
├──────────────────────────┤
│ 时间轴(三层绘制 48px) │
├──────────────────────────┤
│ 筛选标签(可选) │
├──────────────────────────┤
│ 事件标题行(吸顶) │
│ 高光事件列表 │
└──────────────────────────┘
竖版视频
┌──────────────────────────┐
│ 视频播放器 │ ← 占 55%(下拉收起到 35%)
│ cover → contain 过渡 │
├──────────────────────────┤
│ 时间轴 (36px) │ ← 跟随 shrinkFraction
├──────────────────────────┤
│ 筛选标签(pinned 吸顶) │
├──────────────────────────┤
│ 事件标题行(吸顶) │
│ 高光事件列表 │
└──────────────────────────┘
核心交互
1. 视频播放控制
[打点] [◀ 上一条] [▶||] [下一条 ▶] [倍速] [静音] [全屏]
- 倍速循环: 0.5x → 1.0x → 1.5x → 2.0x
- 长按快进: 2x 快速播放 + 触觉反馈
- 上/下一条: 基于 selectedDotId 索引导航,跳转前移 5 秒
2. 时间轴交互
- 拖拽: 30ms 节流 + 磁吸吸附 + 触觉反馈
- 点击 marker: 前移 5 秒跳转 + 自动播放
- 模式切换: 全部 ↔ 仅高光
- 筛选: 按动作类型过滤(联动事件列表和 marker)
3. 高光事件操作
- 点击: 前移 5 秒跳转 + 自动播放
- 左滑操作: 剪辑 / 编辑 / 删除
- 编辑: BottomSheet(动作类型 + 时间微调 ±1s/±5s)
- 已剪辑标签: 绿色 "✂ 已剪辑",点击弹出匹配片段
4. 更多菜单(AppBar 右上角)
| 菜单项 | 条件 |
|---|---|
| 一键剪辑 / 剪辑已选 | 默认 / 多选模式 |
| 查看已有剪辑 | 有剪辑记录 |
| 编辑剪辑参数 | 默认 |
| 导入打点/视频 | recordType=2/3 |
| 分享 / 删除记录 | 默认 |
5. 全屏播放
- 竖版: 同页全屏(AnimationController 300ms)
- 横版: 同页全屏(SystemChrome 旋转屏幕)
- 操作栏 3 秒自动隐藏
状态流转
初始加载 → 检测 isPortrait → 加载打点 → 加载元数据 → 恢复剪辑任务
↓
播放中 → position ~10Hz 更新 → 仅高光模式自动跳转
↓
编辑 → 修改 DotRecord → 重写 .blink → 更新 DB → 联动刷新
↓
剪辑 → submitTask → fire-and-forget → AppBar 进度环 → 完成 Toast
相关文档
- 时间轴模型 — 三层绘制和磁吸算法
- 事件模型 — DotRecord 和筛选逻辑
- 剪辑任务批次 — task_id 和后台执行
- .blink 文件格式 — 打点编辑的加密读写