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
相关产品推荐
相关产品推荐

