View的事件分发机制
Posted 云潇潇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了View的事件分发机制相关的知识,希望对你有一定的参考价值。
public boolean dispatchTouchEvent(MotionEvent ev) 用来进行事件的分发
public boolean onInterceptTouchEvent(MotionEvent ev) 在onInterceptTouchEvent中调用,用来判断是否拦截某个事件
public boolean onTouchEvent(MotionEvent ev) 在onInterceptTouchEvent中调用,用来处理三者的关系
那么三个方法到底有什么区别呢?三者的关系是什么?它们的关系可以用如下代码表示:
public boolean dispatchTouchEvent(MotionEvent ev){
boolean consume = false;
if(onInterceptTouchEvent(ev)){
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
通过上面的代码可以了解到点击事件的传递规则:对于一个要ViewGroup来说,点击事件产生后,首先会传递给他,他的dispatchTouchEvent就会被调用,如果它的onInterceptTouchEvent返回true就表示它要拦截当前事件,接着就会调用它的onTouchEvent,如果返回false就表示它不拦截当前事件,就会传给它的子元素,调用子元素的dispatchTouchEvent,如此反复直到事件被最终处理。
当一个View需要处理事件时,如果设置了OnTouchListener,那么OnTouchListener中的onTouch会被调用,如果返回true,onTouchEvent不再调用,如果返回false才会继续传给onTouchEvent,如果当前设置的有OnClickListener,那么在onTouchEvent中会调用它的onClick方法。由此可见,优先级OnTouchListener > onTouchEvent > onClickListener。
分发是一级一级往下,处理是一级一级往上,当分发到最下级,最下级的onTouchEvent不处理时,会传给上一级处理。
以上是关于View的事件分发机制的主要内容,如果未能解决你的问题,请参考以下文章