WebView添加滑动手势检测后滚动卡顿,求流畅优化方案
解决WebView添加滑动手势后滚动卡顿的问题
问题根源
你的代码中两个关键问题导致了WebView滚动卡顿:
GestureListener的onDown方法返回false,这会让GestureDetector放弃跟踪后续触摸事件,同时破坏了触摸事件的正常传递链。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
相关产品推荐
相关产品推荐

