最近为了明白view时间处理传递机制,特此了做了实验,自定义了viewGroup和LinearLayout做实验,重写了dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent三个方法,总结了四种情况。
事先在脑袋里有这么一些概念:
ACTION_DOWN //表示按下了屏幕
ACTION_MOVE //表示为移动手势
ACTION_UP //表示为离开屏幕
ACTION_CANCEL //表示取消手势,不会由用户产生,而是由程序产生的
一个Action_DOWN, n个ACTION_MOVE, 一个ACTION_UP,就构成了Android中众多的事件
ViewGroup类的控件嵌套时事件触发情况、
0. dispatchTouchEvent()//事件的分发,方法是从父View向子View传递
1. onInterceptTouchEvent() //是否中断事件的传递,如果返回true,则把事件给当前view的onTouchEvent()方法,方法是从父View向子View传递
2. onTouchEvent() //接收事件并处理,从子View向父View传递
//返回值为true表示事件被正确接收和处理了,返回值为false表示事件没有被处理,将继续传递下去。
屏幕view布局:
接着分析四种情况:
情况一:当所有的都不进行处理的时候即返回false ,每个方法里面的 log打印,作为对比参照物。
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.onInterceptTouchEvent
CustomerLinearLayout.dispatchTouchEvent
CustomerLinearLayout.onInterceptTouchEvent
CustomerLinearLayout.onTouchEvent
CustomerViewGroup.onTouchEvent
情况二:当CustomerViewGroup.onInterceptTouchEvent()放回true 的时候,对比情况一,那就说明CustomerViewGroup中断了
事件的传递,他当前的响应交由onTouchEvent()处理,而不往下传递给CustomerLinearLayout,
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.onInterceptTouchEvent
CustomerViewGroup.onTouchEvent
情况三:CustomerViewGroup.dispatchTouchEvent()返回true的时候说明事件不分发,自己方法处理了,对比情况一,就知道CustomerViewGroup.onInterceptTouchEvent
都没有响应了。
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.dispatchTouchEvent
情况四:onTouchEvent(),这个方法比较特殊,和dispatchTouchEvent(),onInterceptTouchEvent()方法不同的是他是
子view往上传递的,意思就说,所有的view一级一级的dispatchTouchEvent(),onInterceptTouchEvent()都是返回false
那么也就是把事件传递到最底层的view,最底层的view中的onTouchEvent()如果返回true,那么就是代表响应,事件就会
这个方法消耗,如果返回false,那么久代表事件没有被处理,那么又会返回到上层父view,直到被处理了。
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.onInterceptTouchEvent
CustomerLinearLayout.dispatchTouchEvent
CustomerLinearLayout.onInterceptTouchEvent
CustomerLinearLayout.onTouchEvent
CustomerViewGroup.dispatchTouchEvent
CustomerViewGroup.onInterceptTouchEvent
CustomerLinearLayout.dispatchTouchEvent
CustomerLinearLayout.onTouchEvent//上面可以看到CustomerViewGroup.onTouchEvent都不打印了也就是说消耗了事件