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;
网友评论