所谓点击事件的事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,这个传递的过程就是分发过程。
三个方法:
public Boolean diapatchTouchEvent(MotionEventev)
用于进行事件分发
public Boolean onInterceptTouchEvent(MotionEventev)
在上述方法内部调用,用于判断是否拦截某个事件
public Boolean onTouchEvent(MotionEvent ev)
用来处理点击事件
上述三个方法的关系:
public boolean dispatchTouchEvent(MotionEvent ev){
boolean consume=false;
if(onInterceptTouchEvent(ev)){
consume=onTouchEvent(ev);
}else{
consume=child.dispatchTouchEvent(ev);
}
return consume;
}
对于一个根ViewGroup来说,点击事件产生后首先会传递给它,这时它的dispatchTouchEvent就会被调用,如果这个ViewGroup的onInterceptTouchEvent方法返回true就表示要拦截当前事件,接着时间就交给这个ViewGroup处理,即它的onTouchEvent方法会被调用;如果这个ViewGroup的onInterceptTouchEvent方法返回flase就表示不拦截事件,这是当前的事件就会传递给子元素,接着子元素的diapatchTouchEvent方法会被调用,如此反复直到处理。
给View设置的OnTouchListener,其优先级比onTouchEvent要高,在onTouchEvent方法中,如果当前设置的有OnClickListener,其优先级最低,即处于事件传递的尾端。
当一个点击事件产生后,它的传递顺序遵循:Activity-Window-View。