Android 事件分发分情况讨论总结
–
强烈建议大家打log验证一下下面说到的每一种状态,有助于加深对它的理解。
推荐博文:https://www.jianshu.com/p/24901c309cf4
–
1、dispatchTouchEvent
返回值的意思:下面是否有view能处理事件?(是否分发成功了事件?),其实返回值最终是onTouchEvent的返回值,只不过不知道是哪一个view。
当返回true,说明下方有东西消费了事件,将继续接受事件。尽管这个true是你骗他的。注意,一切事件都是由Down开始的,不管这三个哪个方法,第一个收到的必须是Down,否则对应方法不会被调用(比如说拦截了Down,最先传进去的是Move,那这个方法不会调用)
当返回super.dispatchTouchEvent(ev),正常分发事件,首先经过onInterceptTouchEvent,根据返回值确定是继续分发还是由自己的onTouchEvent执行。
当返回false,说明自己下方没有东西消费事件,以后就不再会接收到任何事件了。
–
2、onInterceptTouchEvent
返回值的意思:就是简简单单判断是否拦截。true拦截false不拦截。一次点击事件一旦拦截就没有后悔药可以吃了。
当返回true表示拦截,则自己的onTouchEvent执行。一旦拦截,则自己的onTouchEvent执行,不再经过这个方法。如果onTouchEvent返回false,则执行activity的onTouchEvent。
当返回false表示不拦截,继续寻找要命中的onTouchEvent。同时,每一次都还经过这个方法(直到拦截成功)。
–
3、onTouchEvent
返回值的意思:子view是否消费了事件,比如说拖动了一段距离,点击事件等。false表示没有消费事件,则一层层往上传递。注意,一旦命中一次onTouchEvent,那么自始至终都将一直是这个view执行事件,除非拦截或者onTouchEvent返回false。如果返回false,则执行activity的onTouchEvent
当返回true,表示已经消费,不往上传递了。同时,选中当前onTouchEvent为目标,每一次都只能是这个view的onTouchEvent执行。
当返回false,表示自己没有消费,则往上寻找可以消费的view。如果曾经返回过true,则不往上寻找了,直接调用activity的onTouchEvent(这是个坑,注意)