1.为什么会有事件分发机制?
因为在Activity中会有多个view重叠,当点击屏幕上的某个点时,需要知道是谁去处理这个事件。
2.事件分发的是什么?什么是事件序列?
TOUCH事件,事件序列指的是从用户点击屏幕开始到结束,中间产生的一系列的事件。
3.事件有几种类型?
- MotionEvent.ACTION_DOWN 按下时产生的事件
- MotionEvent.ACTION_MOVE 滑动时产生的事件
- MotionEvent.ACTION_UP 抬起时产生的事件
- MotionEvent.ACTION_CANCEL 接收到Down事件,但是后续事件被拦截会出现的事件
4.事件分发流程是什么样的?
Activity->phoneWindow->DecorView->viewGroup->view最终被接收
5.事件分发具体实现?
dispatchTouchEvent:向下分发事件
OnInterceptTouchEvent:拦截事件
onTouchEvent:处理事件
6.事件优先级:
OnTouch返回false,才会走OnTouchEvent,而onClick实在OnTouchEvent里面的方法,OnLongClick返回为false,会同时响应onClick
OnTouchListner>onTouchEvent>onLongClickListener>OnClickListener(因为onClick是在up之后会调用的)
7.滑动冲突
外部拦截法:就是在ViewGroup里使用onInterceptTouchEvent()拦截
内部拦截法:在子View的dispatchTouchEvent()里调用 ,这行代码被调用,父类就不会拦截事件
当传入的参数为true时,表示子组件要自己消费这次事件,告诉父组件不要拦截(抢走)这次的事件。(不能干扰Down事件)
getParent().requestDisallowInterceptTouchEvent(true);
8.长按事件
返回false,长按的话会同时执行onLongClick和onClick;如果setOnLongClickListener返回true,表示事件被消耗,不会继续传递,只执行longClick
9.怎么让view和viewGroup同时响应点击事件?
在view中的onTouchEvent返回false,但是在返回之前调用view的onTouchEvent事件