点击事件的分发过程有三个重要的方法来共同完成
- dispatchTouchEvent(MotionEvent ev):负责进行事件的分发
- onInterceptTouchEvent(MotionEvent event):负责是否拦截某个事件
- onTouchEvent(MotionEvent event):用于处理点击事件
现在我们用类比的方式来讲解事件分发机制
假设你是一个公司的小职员,你的上司是部长,部长的上司是总经理。
- 公司接到一个业务(点击事件开始)
- 首先肯定是总经理先接单(根视图:ViewGroup),判断是否将这个业务派发给部长完成(触发了dispatchTouchEvent(MotionEvent ev)方法)
- 如果总经理觉得这单业务过于简单只需要自己就可以完成,于是便拦截下来,不往下分发了(触发了onInterceptTouchEvent(MotionEvent event))方法返回true
- 总经理就自己处理了这个事件(出发了onTouchEvent(MotionEvent event))
- 回到3,如果总经理觉得这个事情自己不愿意做,便将这个事情派发给了部长(触发了onInterceptTouchEvent(MotionEvent event))返回false
- 部长同时觉得很适合你来做(触发了onInterceptTouchEvent(MotionEvent event))返回false
- 现在任务就应该由你来完成了,你是不可以拦截的(没有onInterceptTouchEvent(MotionEvent event))
处理事件机制
- 设置OnTouchListener,那么OnTouchListener中的onTouch方法会被会调
- 如果OnTouch返回false,就调用当前View的onTouchEvent
- 如果返回true,那么onTouchEvent就不会被调用
- 在onTouchEvent方法中,如果设置了OnClickListener,那么它的onClick会被调用,所以OnClickListener优先级最低