- 1. 事件分发机制分发的是什么
- 2. ACTION_CANCEL什么时候触发
- 3. 什么是滑动冲突
- 4. 父view拦截事件的方式(解决滑动冲突的方式)
当用户点击屏幕里View或者ViewGroup的时候,将会产生一个事件对象,这个事件对象就是MotionEvent对象,这个对象记录了事件的类型,触摸的位置,以及触摸的时间等。MotionEvent里面定义了事件的类型,其实很容易理解,因为用户可以在屏幕触摸,滑动,离开屏幕动作,分别对应:
MotionEvent.ACTION_DOWN:用户触摸View&ViewGroup。
MotionEvent.ACTION_MOVE:用户手指移动View&ViewGroup。
MotionEvent.ACTION_UP:用户手指离开屏幕。
MotionEvent.ACTION_CANCEL:事件退出了,不是用户导致的。
因此用户在触摸屏幕到离开屏幕会产生一系列事件,
2. ACTION_CANCEL什么时候触发ACTION_DOWN->ACTION_MOVE(0个或者多个)->ACTION_UP
3. 什么是滑动冲突如果某一个子View处理了Down事件,那么随之而来的Move和Up事件也会交给它处理。但是交给它处理之前,父View还是可以拦截事件的,如果拦截了事件,那么子View就会收到一个Cancel事件,并且不会收到后续的Move和Up事件。
对于相互嵌套的两个View,他们两个谁去处理一个滑动事件
4. 父view拦截事件的方式(解决滑动冲突的方式)
- 外部拦截法:指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就不拦截。具体方法:需要重写父容器的onInterceptTouchEvent方法,在内部做出相应的拦截。
- 内部拦截法:指父容器不拦截任何事件,而将所有的事件都传递给子容器,如果子容器需要此事件就直接消耗,否则就交由父容器进行处理。
具体方法:
重写子View的dispatchTouchEvent
需要配合requestDisallowInterceptTouchEvent方法



