事件分发总结

ViewGroup:

dispatchTouchEvent 分发

ViewGroup接收到事件之后,根据dispatchTouchEvent决定是否分发下去

1、默认返回 super.dispatchTouchEvent(ev)方法,即默认分发事件

2、如果返回false;事件将不再分发,直接返回给上一层的onTouch方法,并且后面的事件将不再分发给当前ViewGroup,上层直接自己分发并消费掉

3、如果返回true,事件将不再分发并且由ViewGroup的dispatchTouchEvent 消费掉,后面的触摸事件也会同样被ViewGroup的dispatchTouchEvent 消费

onInterceptTouchEvent 拦截

ViewGroup的dispatchTouchEvent如果默认将事件分发下去,传递给onInterceptTouchEvent方法,由onInterceptTouchEvent方法决定是否拦截

1、默认返回super.onInterceptTouchEvent(ev)  即不拦截,事件继续传递

2、改为返回true,事件直接传递给ViewGroup的onTouchEvent方法消费,不再传递给ViewGroup中的View

3、如果返回false,事件将传递给ViewGroup中的View去处理

onTouchEvent 消费

如果ViewGroup中的onInterceptTouchEvent 默认不拦截事件,这时根据ViewGroup的onTouchEvent返回值来判断

1、默认返回super.onTouchEvent(event),事件将传递给ViewGroup中的View进行处理,如果ViewGroup中View不消费事件,事件将会返回给ViewGroup的onTouchEvent方法处理,ViewGroup的onTouchEvent方法默认不处理,返回给上层的onTouchEvent方法处理

2 、如果返回true,,事件也会传递给ViewGroup中的View进行处理,如果ViewGroup中View不消费事件,事件将会返回给ViewGroup的onTouchEvent方法,这时ViewGroup的onTouchEvent直接将事件消费掉,不返回上层的onTouchEvent方法了

3、如果返回false,事件将默认由ViewGroup传递给View,View不处理又返回给ViewGroup的onTouchEvent,ViewGroup的onTouchEvent返回false,所以事件又返回给上层的onTouchEvent方法

View:

dispatchTouchEvent 分发

View接收到事件后,根据dispatchTouchEvent方法返回值,判断是否继续分发

1、默认返回super.dispatchTouchEvent(ev),事件将分发下去,传递给View自己的onTouchEvent进行处理,

2、如果返回false,事件将不分发,直接返回给上层ViewGroup的onTouchEvent方法进行处理

3、如果返回true,事件也不再分发,直接由View的dispatchTouchEvent 进行消费,并且以后的事件同样直接被View的dispatchTouchEvent 方法消费了

onTouchEvent 消费

如果View的dispatchTouchEvent 将事件传递给onTouchEvent方法,将根据onTouchEvent方法的返回值决定是否消费事件

1、默认返回super.onTouchEvent(event),默认不消费事件,事件将返回给上层ViewGroup的onTouchEvent方法处理

2、如果改为true,将事件消费,不再返回,以后其他事件同样被onTouchEvent方法消费

3 、如果改为false,同默认方法一样,不再消费,返回给上层处理

所以,触摸事件的所有流程已经很清晰了

对于事件分发:(dispatchTouchEvent)

如果想事件不向下传递,自己消费掉:将当前的dispatchTouchEvent返回true;

如果想事件不向下传递,返回给上层:将当前的dispatchTouchEvent返回false;

对于事件拦截:(onInterceptTouchEvent)

如果想拦截事件,给自己的onTouchEvent方法消费:将onInterceptTouchEvent返回true

如果不拦截事件,默认向下传递:将onInterceptTouchEvent返回false或者返回默认值

对于事件消费:(onTouchEvent)

如果不想消费,返回给上层:将onTouchEvent返回默认或者返回false;

如果想消费,不再返回:将onTouchEvent返回true;

你可能感兴趣的:(事件分发总结)