当触摸屏幕时候,
--先调用Activity中的dispatchTouchEvent函数,分发事件,找到点击位置所在的第一个子控件viewgroup1,
--然后将事件传递个viewgroup1的dispatchTouchEvent函数,然后看viewgroup1的onInterceptTouchEvent()是否拦截,ture,拦截,不向下传递。false,拦截,向下传递,因为viewGroup下还包括子View,所以默认返回值为false,即不拦截此ACTION_DOWN事件。
--然后找到他的子控件viewgroup3,反复推断。
--假设前面都没有拦截的话,然后再找到button1的dispatchTouchEvent()函数。在底层做触摸事件的响应.
触摸事件的传递从上往下(隧道方式)传递。
隧道方式,即从根元素依次往下传递直到最内层子元素或在中间某一元素中因为某一条件停止传递。
事件的传递是从下往上(冒泡方式)传递。
事件传递到button1的onTouchEvent函数处理。默认返回ture。接着button1的dispatchTouchEvent返回true,再接着viewGroup的dispatchTouchEvent返回true,最后Activity的dispatchTouchEvent返回true。
注1:(view与viewGroup的DispatchTouchEvent函数):
Button1是view,而他的父控件们都是viewgroup,他们的dispatchTouchEvent()不一样.
ViewGroup的dispatchTouchEvent依据onInterceptTouchEvent() 返回值来做处理,返回ture,做触摸事件处理,返回false做分发事件处理.
View没有dispatchTouchEvent()函数,依据点击事件的回调或触摸事件的回调来处理.
注2:(找到子控件的过程)
找到子控件的过程跟事件分发过程一致。
推断手指是否落在父viewgroup矩形区域内。假设是遍历子节点,看落在子节点那个区域内。直到找到子view为止。
注3:
事件dispatchTouchEvent向下传递过程中返回的结果默认不是true,而是一个过程。
是找子控件的过程。
处理结果向上传递过程中dispatchTouchEvent默认返回false.
最后:总体流程分析
1. Android事件分发是先传递到ViewGroup。再由ViewGroup传递到View的。
2,在向下传递过程中。能够通过onInterceptTouchEvent对事件传递进行拦截,若返回ture的话不再向下传递,直接从该控件处理事件。
3。
2. 在ViewGroup中能够通过onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不同意事件继续向子View传递,返回false代表不正确事件进行拦截。默认返回false。
3,事件处理过程向上分发的时候,
Button的ontouch事件
//返回ture。不响应click事件
//返回false,响应click事件
//依据底层代码,不管返回ture还是false,仅仅要这种方法是可点击的,dispatchTouchEvent就返回true;
传递给viewGroup1的dispatchTouchEvent处理,假设将其返回值设置为false,则。分发事件终止。由自己来处理(此时button和viewGroup1都返回点击事件)。
假设viewGroup1的dispatchTouchEvent返回ture,就是向上分发,我不处理的意思。
仅仅有button的处理逻辑生效