You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中YouTube视频拖动滑块卡顿问题修复求助

修复滑块卡顿与过度灵敏问题

直接修改SingleVideoView中的onChange逻辑,核心是基于拖动偏移量计算相对进度变化,而非直接映射触摸坐标到绝对进度,同时限制单次进度调整幅度,避免跳变:

// 先在SingleVideoView类中添加成员变量记录初始状态
private var initialTouchProgress = 0.0
private var initialTouchX = 0f

// 修改onChange块逻辑
onChange = { touchX ->
    if (initialTouchX == 0f) {
        // 首次触发拖动时,记录初始触摸位置和对应进度比例
        initialTouchX = touchX
        initialTouchProgress = videoPlayer.currentPosition.toDouble() / videoPlayer.duration.toDouble()
    }

    // 计算拖动的相对偏移比例(基于视图宽度)
    val dragOffsetRatio = (touchX - initialTouchX) / viewWidth
    // 计算目标进度比例,限制在0-1范围内防止超出视频时长
    val targetProgressRatio = max(0.0, min(1.0, initialTouchProgress + dragOffsetRatio))
    // 转换为视频绝对进度(转为Long类型,避免频繁小数位波动)
    val targetProgress = (targetProgressRatio * videoPlayer.duration).toLong()

    // 设置进度差异阈值,忽略触摸微小抖动,减少无效更新
    val progressThreshold = videoPlayer.duration * 0.005 // 取视频时长的0.5%作为阈值
    if (abs(targetProgress - videoPlayer.currentPosition) > progressThreshold) {
        videoPlayer.seekTo(targetProgress)
        slider.progress = targetProgressRatio
    }
}

// 拖动结束时重置初始状态(在onRelease块中补充)
onRelease = {
    initialTouchX = 0f
    initialTouchProgress = 0.0
}

关键优化点:

  • 相对偏移计算:基于初始触摸位置的偏移量推导进度变化,避免触摸抖动导致的滑块跳变。
  • 范围约束:强制目标进度比例在0-1区间内,防止超出视频首尾时长。
  • 阈值过滤:忽略微小的进度波动,减少不必要的seekTo调用和滑块刷新,提升流畅度。
  • 整数化进度:将目标进度转为Long类型,避免频繁的小数位调整,让滑块移动更线性。

修改后滑块会跟随拖动动作平滑响应,不会出现过度灵敏的跳变,同时保持拖动跳转的准确性,无需额外动画。

内容的提问来源于stack exchange,提问作者Ahmed Zaidan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:12:12