原因:ViewPager默认的onInterceptTouchEvent方法中在判断出正在滑动时就拦截了触摸事件。
解决: 子View收到ACTION_DOWN时调用requestDisallowInterceptTouchEvent(true)请求所有的父控件不要拦截
源码分析
ViewGroup的dispatchTouchEvent()收到触摸事件ViewPager的onInterceptTouchEvent()判断是否正在进行拖动(mIsBeingDragged),如果正在进行拖动就拦截事件,否则就不管(所以第一次ACTION_DOWN就成功分发到了子View上)- 子
View的onTouchEvent()收到ACTION_DOWN事件后调用requestDisallowInterceptTouchEvent(true)申请不要拦截
ViewGroup.dispatchTouchEvent()
if (actionMasked == MotionEvent.ACTION_DOWN) { |
所以:
getParent().requestDisallowInterceptTouchEvent(true)是要在接收ACTION_DOWN之后,并在接收ACTION_UP或ACTION_CANCEL事件之前调用才有效。
ViewPager.onInterceptTouchEvent()
public boolean onInterceptTouchEvent(MotionEvent ev) { |
View.onTouchEvent()
override fun onTouchEvent(event: MotionEvent?): Boolean { |
View.requestDisallowInterceptTouchEvent()
|
注意:会递归请parent也不要拦截