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

如何正确识别上滑操作?解决视频播放触摸事件冲突

解决视频播放触摸事件冲突:区分点击与上滑操作

你不能直接在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
}

关键细节说明

  1. 滑动阈值调整:代码中的位移阈值(15px)和时间阈值(500ms)可以根据你的界面交互体验微调,确保准确区分点击和滑动。
  2. 避免重复触发:加!isSwipeUpTriggered判断,确保swipeUpAction()只在第一次检测到上滑时执行一次。
  3. 状态标记:isSwipeUpTriggered标记用于在ACTION_UP时跳过恢复逻辑,保证上滑后视频保持暂停状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:13:18