view事件分发

view事件分发

android的页面结构类似一个树形结构,viewGroup包含多个view或者viewGroup。用户的动作从根部向下分发,最后到达要消费的view层,如何决定这个动作在哪里消费的逻辑,就是事件分发的存在的意义。

事件分发主要通过两个方法实现,dispatchTouchEventonInterceptTouchEvent

dispatchTouchEvent方法是确定动作事件要分发到这一层

1
2
3
4
5
6
7
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.e(DispatchViewGroup.class.getSimpleName(), "dispatchTouchEvent = " + dispatch);
// dispatch为true的话,这一层view同意将点击事件下发到这一层,那么接下来会走到该viewGroup的 onInterceptTouchEvent方法。
// dispatch为false的话,这一层view不同意将点击事件下发到这一层,直接回到上一层的onTouchEvent
return dispatch ? super.dispatchTouchEvent(ev) : false;
}
1
2
3
4
5
6
7
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.e(DispatchViewGroup.class.getSimpleName(), "onInterceptTouchEvent = " + intercept);
// intercept为true的话,会拦截这个动作,直接调用这个viewGroup的onTouchEvent
// intercept为false或者super.onInterceopTouchEventde()的话,就下发这个动作了。
return intercept;
}
1
2
3
4
5
6
7
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e(DispatchSubViewGroup.class.getSimpleName(), "onTouchEvent = " + touch);
// 如果touch为true的话,这个动作被消费了,不会在回传到父布局了。
// 如果touch为false的话,这个动作没有被消费,如果该布局还有子布局,那么向下传递,如果这个布局已经是最下层的布局,则向父布局的onTouchEvent传递。
return touch ? true: super.onTouchEvent(event);
}

最后,view是没有onInterceptTouchEvent事件的。