view传递事件的处理机制(自定义了viewGroup和LinearLayout做实验)

来源:互联网 发布:欧洲卡车模拟2设置优化 编辑:程序博客网 时间:2024/05/20 11:36

最近为了明白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都不打印了也就是说消耗了事件

对比上述的实验,也就能明白了,view事件的传递机制了,对于自定义view有很大帮助。