先说说我找到的写得比较好的博文:http://www.cnblogs.com/lwbqqyumidi/p/3500997.html
别处的事件分发与事件上传相关的文章写的长而难以理解。
我稍微总结一下。
本文目测初心者也能秒懂。
这图我也直接盗来了,这三个函数就是核心函数。
事件处理机制分为两个阶段:事件分发和事件上传。
具体流程是V字形。
事件分发是自顶向下:Activity => Window => ViewGroup => View
事件上传事自底向上:View => ViewGroup => Window =>Activity
所以事件处理的流程是V字形。
dispatchTouchEvent确定事件是否继续分发。
onInterceptTouchEvent函数确定是否拦截事件。
onTouchEvent函数确定如何处理事件。
dispatchTouchEvent函数和onInterceptTouchEvent函数只在事件分发中使用。
onTouchEvent函数只在事件上传中使用。
分发函数返回值:
为true则表示事件处理已结束,不需再做任何处理。
为false则表示事件分发结束,本层也继续处理,而开始事件上传,之后交给上层onTouchEvent函数处理。
为super.dispatchTouchEvent则表示需要继续分发。
拦截函数返回值:
为true则表示本层要拦截事件,之后不再分发,而开始事件上传,之后交给本层onTouchEvent函数处理。
为false则表示不拦截事件,之后继续事件分发,将事件传递给下一层的dispatchTouchEvent处理。
为super.onInterceptTouchEvent则和值为false时一致。
响应函数返回值:
为true则表示事件已经处理完,则事件处理流程结束,结束事件上传流程并不再做任何处理。
为false则表示事件还没有处理完,需要继续事件上传由上层onTouchEvent函数继续处理。
为super.onTouchEvent则和值为false时一致。
总结:
分发函数是本层的门神,
他说否(false),拒绝了事件进入,则本层不能接触到事件了,事件会跑向上层。
他说是(true),则事件已经被它消灭掉了。
他说留条活路(super),本层才会继续审问事件。
拦截函数是后门的门神,
他说是(true),就要在本层开始行刑,执行官是响应函数。
他说否(false),就睁一只眼闭一只眼让事件放行。
他说留条活路(super),同上。
响应函数是执行官,
他说是(true),就说明事件已被他处理掉。
他说否(false),就说明事件处理了一半逃到上层去了。
他说留条活路(super),同上。
非常直观形象。