Skip to content

fix(player): 修复进度条拖动回跳问题#2932

Open
AmisKwok wants to merge 3 commits intoopen-ani:mainfrom
AmisKwok:amis/fix-seekTo-0331
Open

fix(player): 修复进度条拖动回跳问题#2932
AmisKwok wants to merge 3 commits intoopen-ani:mainfrom
AmisKwok:amis/fix-seekTo-0331

Conversation

@AmisKwok
Copy link
Copy Markdown

问题原因

这个问题的根本原因是 异步操作导致的竞态条件 :

  1. 用户松开进度条时, seekTo() 被调用,但这是一个异步操作
  2. 播放器的实际位置不会立即更新,需要一定时间(通常 100-300ms)
  3. 但进度条的状态会立即重置,导致它显示的是旧的播放位置
  4. 直到播放器位置真正更新后,进度条才显示新位置
    快速拖动的问题 :
  • 拖动到 A 点松开 → seekTo(A) 被调用
  • 拖动到 B 点松开 → seekTo(B) 被调用
  • 播放器可能先完成 A 的 seek,导致短暂跳到 A
  • 进度条检测到位置接近 A,结束 seeking 状态
  • 但用户期望的是 B 点,造成混淆

解决方案

引入"Seeking 状态"来保持进度条显示的一致性:

  • 当用户松开进度条时,记录目标位置并标记为"正在 Seeking"
  • 在 Seeking 期间,进度条继续显示目标位置,而不是实际播放位置
  • 记录 最后一次 seek 的位置 ,忽略中间的 seek 完成
  • 只在播放器位置接近 最后一次 seek 的位置 时,才结束 Seeking 状态
  • 恢复正常显示逻辑

修改效果

修改前:

  • 拖动进度条到 2:00 → 松开手指 → 进度条瞬间跳回 1:00 → 等待 → 进度条跳到 2:00

  • 快速拖动 A→B → 进度条可能短暂跳回 A 点
    修改后:

  • 拖动进度条到 2:00 → 松开手指 → 进度条保持显示 2:00 → 播放器位置到达 2:00 → 正常播放

  • 快速拖动 A→B → 进度条保持显示 B 点,不会跳回 A

AmisKwok and others added 3 commits April 1, 2026 02:34
test(video-player): 添加 MediaProgressSliderState 单元测试

- 解决播放器实际位置滞后导致的进度条回跳
- 新增 isSeeking 状态与 targetPositionMillis 记录目标
- 在 seek 完成前强制 UI 显示目标位置而非实际位置
- 添加轮询检测机制,当位置误差小于 500ms 时结束 seeking
- 测试基本的拖动操作与状态同步
- 测试快速连续拖动时的状态更新逻辑
- 测试 seek 完成的判定条件及误差范围
- 测试预览比例为 NaN 时的边界情况
- 增加 `isPreviewing` 状态断言,验证预览期间及结束后的状态
- 模拟播放器位置追赶过程,确保未到达目标时保持预览状态
- 调用 `checkSeekingComplete` 验证到达目标后状态正确切换
- 移除未使用的 `mutableStateOf` 导入
@AmisKwok
Copy link
Copy Markdown
Author

AmisKwok commented Apr 2, 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.

1 participant