常见的滑动冲突常见有两种:
第一种是像这样不同方向的滑动冲突,这种就是我这次遇到的问题。
第二种是同方向滑动冲突。
这种冲突经常在Viewpager+BottomNavigator组合中见到,常规的做法就是禁用一方的滑动。
主要还是来看第一种:
我这个案例里面外部是一个纵向滑动的RecyclerView,内部是可以通过横向滑动删除的item,但是我发现我在内部滑动的时候,只要角度稍微大一点,就会导致内部Item划不动。遇到这种情况,我就想到可能是博客中常见的滑动冲突。所以我就想通过每次滑动的角度来判断是横向滑动还是纵向滑动。
代码
class VerticalRecyclerview @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyleAttr: Int = 0
) : RecyclerView(
context,
attributeSet,
defStyleAttr
) {
private var initX: Float = 0f
override fun onInterceptTouchEvent(e: MotionEvent?): Boolean {
if (e != null) {
when (e.action) {
MotionEvent.ACTION_DOWN -> {
initX = e.rawX
}
MotionEvent.ACTION_MOVE -> {
if (e.rawX - initX >= ViewConfiguration.get(context).scaledTouchSlop) {
return false
}
}
MotionEvent.ACTION_UP -> {
if (e.rawX - initX >= ViewConfiguration.get(context).scaledTouchSlop) {
return false
}
}
}
Log.e("123", "${e.rawX - initX}")
}
return super.onInterceptTouchEvent(e)
}
}
我就对onInterceptTouchEvent()这个方法进行修改,该方法返回true表示这个组件消费点击事件,不传递给下一层,返回false表示传递给下一层处理。利用这个特性就可以解决我这个问题