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

WebView添加滑动手势检测后滚动卡顿,求流畅优化方案

解决WebView添加滑动手势后滚动卡顿的问题

问题根源

你的代码中两个关键问题导致了WebView滚动卡顿:

  1. GestureListener的onDown方法返回false,这会让GestureDetector放弃跟踪后续触摸事件,同时破坏了触摸事件的正常传递链。
  2. onTouch方法直接返回GestureDetector的处理结果,导致WebView的原生滚动触摸事件被拦截,无法正常响应滚动操作。

修复方案

1. 修改OnSwipeWebviewTouchListener代码

调整触摸事件的处理逻辑,确保WebView能接收原生触摸事件,同时保留滑动手势检测:

class OnSwipeWebviewTouchListener(ctx: Context?, touchListener: TouchListener) : View.OnTouchListener {
    private val gestureDetector: android.view.GestureDetector

    init {
        gestureDetector = GestureDetector(ctx, GestureListener(touchListener))
    }

    override fun onTouch(v: View?, event: MotionEvent): Boolean {
        // 先让手势检测器处理滑动事件,再返回false让WebView处理原生滚动
        gestureDetector.onTouchEvent(event)
        return false
    }

    private inner class GestureListener internal constructor(touchListener: TouchListener) : GestureDetector.SimpleOnGestureListener() {
        private val touchListener: TouchListener

        init {
            this.touchListener = touchListener
        }

        override fun onDown(e: MotionEvent): Boolean {
            return true // 必须返回true,才能让GestureDetector跟踪完整触摸序列
        }

        override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
            var result = false
            try {
                val diffY = e2.y - e1.y
                val diffX = e2.x - e1.x
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > 30 && Math.abs(velocityX) > 30) {
                        if (diffX > 0) {
                            touchListener.onSwipeRight()
                        } else {
                            touchListener.onSwipeLeft()
                        }
                        result = true
                    }
                } else if (Math.abs(diffX) < Math.abs(diffY)) {
                    if (Math.abs(diffY) > 30 && Math.abs(velocityY) > 30) {
                        if (diffY > 0) {
                            touchListener.onSwipeDown()
                        } else {
                            touchListener.onSwipeUp()
                        }
                        result = true
                    }
                } else {
                    result = false
                }
            } catch (exception: Exception) {
                exception.printStackTrace()
            }
            return result
        }
    }
}

interface TouchListener {
    fun onSwipeLeft() {
        Timber.d("Swipe left")
    }

    fun onSwipeRight() {
        Timber.d("Swipe right")
    }

    fun onSwipeUp() {
        Timber.d("Swipe up")
    }

    fun onSwipeDown() {
        Timber.d("Swipe Down")
    }
}

2. 修正WebViewActivity中的错误

onSwipeUp方法里错误调用了super.onSwipeDown(),改成正确的super.onSwipeUp():

override fun onSwipeUp() {
    super.onSwipeUp()
    if (supportActionBar == null)
        return

    supportActionBar?.let {
        if (it.isShowing) {
            it.hide()
        }
    }
}

修复说明

  • onDown返回true:确保GestureDetector能完整跟踪触摸事件序列,保证滑动手势能被正常检测到。
  • onTouch返回false:让WebView的原生触摸事件不被拦截,滚动、缩放等交互恢复流畅。
  • 修正方法调用错误:避免触发不符合预期的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:14:56