问题描述:
RecyclerView在滑动至最后一个item时, 继续向左滑动RecyclerView将不再消费消息,消息向上传递,会触发外层的ViewPager的滑动。需要避免该情况。
宽泛的说,是如何控制消息被指定的View消费。
Android的事件传递,是从父-子,如果父View没有拦截,那么是否消费事件的决定权就在子节点,如果子节点消费了事件,事件就不再传递到父节点了。
关于消息传递和拦截,以下三个函数我们比较熟悉:
dispatchTouchEvent(MotionEvent ev): 用来分发触摸事件
onInterceptTouchEvent(MotionEvent ev): 事件的拦截, ViewGroup独有, 在dispatchTouchEvent()中调用
onTouchEvent(MotionEvent ev): 用来处理点击事件
因为父View无法知道子View什么时候不消费事件,所以需要在子View中进行控制。
消息拦截
参考上图,dispatchTouchEvent每次接受到点击事件时,会初始化触摸状态,然后判断disallowIntercept是否为true,如果为true,不执行onInterceptTouchEvent。
父View的disallowIntercept,可以由子View调用parent.requestDisallowInterceptTouchEvent
来控制。所以,子View可以在任意地方,控制父View是否拦截消息。
有一点需要注意,原生的onInterceptTouchEvent方法实现,并不会直接拦截所有事件(需要满足yDiff>mTouchSlop),所以子View仍然有机会获取事件,并调用parent.requestDisallowInterceptTouchEvent
。
网友评论