android事件分发机制

onTouchEvent能否被调用是取决于谁?取决于outouch返回值,如果onTouch返回true,不好意思,直接整个dispatchTouchEvent返回true,onTouchEvent连被调用的机会都没有(且onTouch方法能否被调用又取决于OnTouchLIstener对象不为空,且当前控件可用)。所以只有当onTouch返回false时ontouchevent方法才可被调用,此时才是由这方法决定整个dispatchtouchEvent方法的返回值,且还有一个主要关键点,onTouchEvent可否返回true取决于控件是否可点击(clickable),如果控件可点击,那么不管怎么样,最后都会返回true,不可点击则一定返回false,此时在分发事件给此控件的父容器中会因为这个子View的onDispatchTouchEvent返回false而导致不能直接在这个父容器中返回true,从而会继续执行这个父容器的onDispatchTouchEvent方法中的后面的代码,从而执行了这个容器本身作为View的事件分发,这里就相当于与View的事件分发,又取决于OnTouch或OnTouchEvent方法的返回值,如果再是返回false,就会在这个容器的父容器的OnDispatchTouchEvent中继续执行后面的内容,此时又是执行这个容器本身作为View的事件分发,一直返回。。直到activity中被消耗。

对于 dispatchTouchEvent,onTouchEvent,return true是终结事件传递。return false 是回溯到父View的onTouchEvent方法。

ViewGroup 想把自己分发给自己的onTouchEvent,需要拦截器onInterceptTouchEvent方法return true 把事件拦截下来。

ViewGroup 的拦截器onInterceptTouchEvent 默认是不拦截的,所以return super.onInterceptTouchEvent()=return false;

View 没有拦截器,为了让View可以把事件分发给自己的onTouchEvent,View的dispatchTouchEvent默认实现(super)就是把事件分发给自己的onTouchEvent。

android事件分发机制_第1张图片

你可能感兴趣的:(android事件分发机制)