实测有效,上代码innerRecyclerView:
class InnerRecyclerView(context: Context, attrs: AttributeSet?) : RecyclerView(context, attrs) {
private var startX = 0f
private var startY = 0f
override fun onInterceptTouchEvent(e: MotionEvent): Boolean {
when (e.action) {
MotionEvent.ACTION_DOWN -> {
startX = e.x
startY = e.y
// 让父视图不要拦截触摸事件
parent.requestDisallowInterceptTouchEvent(true)
}
MotionEvent.ACTION_MOVE -> {
val deltaX = e.x - startX
val deltaY = e.y - startY
if (Math.abs(deltaX) > Math.abs(deltaY)) {
// 横向滑动,请求父视图不要拦截事件
parent.requestDisallowInterceptTouchEvent(true)
} else {
// 纵向滑动,让父视图拦截事件
parent.requestDisallowInterceptTouchEvent(false)
}
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
// 允许父视图拦截触摸事件
parent.requestDisallowInterceptTouchEvent(false)
}
}
return super.onInterceptTouchEvent(e)
}
}