View的事件分发机制
关于事件分发的几个重要函数
public boolean dispatchTochEvent(MotionEvent ev)
顾名思义,用来分发事件,返回值代表是否消耗当前事件
public boolean onInterceptTouchEvent(MotionEvent event)
表示是否拦截当前事件,如果已经拦截了,不会被再次调用
public boolean onTouchEvent(MotionEvent event)
用来处理点击事件,返回值表示是否消耗事件,不消耗就不会再次接收到事件
上面三者的具体关系可以参考下面的伪代码
public boolean onTouchEvent(MotionEvent ev){
boolean consume = false;
if(onInterceptTouchEvent(ev)){
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}
returen consume;
}
有了以上伪代码我们就可以比较清楚的看到整个分发流程了,就这么简单。
在事件的末端是onTouchEvent,在内部,如果我们设置了onClickListener的话,就会被调用,可以见得,onClickListener的优先级其实是最低的。
事件传递的顺序
当点击事件产生之后,首先交给ACTIVITY->WINDOW->View
按照这个顺序依次传递到底部,如果底部无法处理,那么就返回给上一级处理,依次类推。