全文参考https://blog.csdn.net/carson_ho/article/details/54136311 ,只是自己理解整理一次,加深印象
点击事件相关的四个方法
控件的onTouch方法,这个方法和onTouchEvent不是同一个,要注意区别
如果onTouch方法return true,那么会走dispatchTouchEvent,不会走自己的onTouchEvent方法,也就不会响应点击事件
如果onTouch方法 返回 false,会执行onTouchEvent 之后点击事件也会正常执行,默认就是false
onTouch在onTouchEvent之前执行

dispatchTouchEvent() 事件分发
当按下那一刻,事件会通过dispatchTouchEvent分发
如果直接设置return true,会调用activity.dispatchTouchEvent(),父布局的onInterceptTouchEvent()也会走,但是不会走父布局的onTouchEvent
如果直接设置return false,会调用父布局的所有流程
无论返回是否true,还是false,都不会走自己的onTouchEvent事件

onTouchEvent 事件处理
无论自己设置为return false,或者return true,都不会走自己的onClick,除非是默认,因为不会调用performClick()方法,自己直接设置也可以
如果直接return false,那么就会返回给父布局的onTouchEvent
如果为true那么自己会直接消费掉事件,子控件的点击事件还是会走,并不会影响子控件
onInterceptTouchEvent 事件拦截
只有ViewGroup有,拦截点击事件,在自己onTouch之前执行,如果为true,调用自己dispatchTouchEvent,onTouch,onTouchEvent 正常流程处理事件,不会传递到子view

完整的流程图

网友评论