如何正确识别上滑操作?解决视频播放触摸事件冲突
解决视频播放触摸事件冲突:区分点击与上滑操作
你不能直接在ACTION_MOVE中过滤ACTION_DOWN和ACTION_UP事件——这三个事件是独立触发的,ACTION_MOVE阶段无法回溯修改已执行的ACTION_DOWN逻辑。正确的做法是延迟判断用户操作类型,直到明确是点击还是滑动后,再执行对应动作。
核心实现思路
- 记录
ACTION_DOWN的时间和触摸位置 ACTION_DOWN时先执行暂停,但暂不触发恢复逻辑ACTION_MOVE中检测上滑动作,标记当前为滑动操作ACTION_UP时根据位移、时间判断是点击还是滑动:- 点击(位移小、触摸时间短):执行恢复播放
- 上滑:跳过恢复逻辑,保持视频暂停
调整后的代码
private var lastDownTime: Long = 0 private var lastDownTouchPosition: Pair<Float, Float>? = null private var isSwipeUpTriggered = false override fun onTouch(view: View, event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN -> { lastDownTime = System.currentTimeMillis() lastDownTouchPosition = event.rawX to event.rawY isSwipeUpTriggered = false // 按下时直接暂停视频 touchAction(TouchEvent.TOUCH_START) } MotionEvent.ACTION_UP -> { val downPosition = lastDownTouchPosition ?: return false val deltaX = downPosition.first - event.rawX val deltaY = downPosition.second - event.rawY val touchDuration = System.currentTimeMillis() - lastDownTime // 判断是否为有效点击:位移阈值10px,触摸时长阈值500ms val isClick = deltaX.absoluteValue < 10 && deltaY.absoluteValue < 10 && touchDuration < 500 // 只有点击操作才触发恢复播放,上滑触发过则跳过 if (isClick && !isSwipeUpTriggered) { touchAction(TouchEvent.TOUCH_END) } } MotionEvent.ACTION_MOVE -> { val downPosition = lastDownTouchPosition ?: return false val deltaX = downPosition.first - event.rawX val deltaY = downPosition.second - event.rawY // 检测上滑:纵向位移远大于横向,且向上滑动(deltaY>0表示手指从下往上移动) if (!isSwipeUpTriggered && deltaY.absoluteValue - deltaX.absoluteValue > 15 && deltaY > 0) { isSwipeUpTriggered = true swipeUpAction() // 打开设置窗口 } } } return true }
关键细节说明
- 滑动阈值调整:代码中的位移阈值(15px)和时间阈值(500ms)可以根据你的界面交互体验微调,确保准确区分点击和滑动。
- 避免重复触发:加
!isSwipeUpTriggered判断,确保swipeUpAction()只在第一次检测到上滑时执行一次。 - 状态标记:
isSwipeUpTriggered标记用于在ACTION_UP时跳过恢复逻辑,保证上滑后视频保持暂停状态。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

