记一次滑动冲突的解决

428 阅读1分钟

常见的滑动冲突常见有两种:

​ 第一种是像这样不同方向的滑动冲突,这种就是我这次遇到的问题。

image-20210408141128455

​ 第二种是同方向滑动冲突。

image-20210408141504530

这种冲突经常在Viewpager+BottomNavigator组合中见到,常规的做法就是禁用一方的滑动。

主要还是来看第一种:

image-20210408141703064

我这个案例里面外部是一个纵向滑动的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表示传递给下一层处理。利用这个特性就可以解决我这个问题

参考文章

www.jianshu.com/p/982a83271…