1、遵循 Activity => ViewGroup => View 的传递顺序(由上级往下级传,下级能处理就处理,处理不了就、往上传)
如果view没有处理事件,则反向传递,如果都没有消费,最终由Activity的onTouchEvent方法来处理
2、dispatchTouchEvent:用来事件分发,当事件传递给view时就会被调用
onInterceptTouchEvent:用于拦截事件,在dispatchTouchEvent内被调用(只有VewGroup中有)
onTouchEvent:在dispatchTouchEvent中调用,用来处理事件
3、当事件传递给ViewGroup时,dispatchTouchEvent会被调用,
如果onInterceptTouchEvent返回true,表示拦截,事件由 viewGroup的onTouchEvent 方法处理。
如果返回false,则不拦截,将事件传递给子View。
View拿到事件后调用自己的dispatchTouchEvent方法,然后调用onTouchEvent方法,
通过 onTouchEvent的返回值来决定是否消费事件,
如果返回true,自己处理
如果返回fals,则向上传递父级的onTouchEvent处理
4、滑动冲突
ScrollView嵌套ViewPager
1、外部拦截
重写父View(外层)的onInterceptTouchEvent方法,判断左右滑动和上下滑动的距离,由此决定是否消费事件(return true)
2、内部拦截
先在Action_down 请求父View不拦截requestDisallowInterceptTouchEvent(true),
再在Action_move中根据条件判断父View是否拦截