原因: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也不要拦截