本帖最后由 余琪琪老师 于 2015-12-27 16:52 编辑
touch事件的分发是面试中非常常见的问题,并且在开发中也是很实用的。下面深圳问答网的师生来探讨一下这个问题。
学生问题:整个touch事件的传递事件具体是怎样的?
老师回答:
1、dispatchTouchEvent作用:决定事件是否由onInterceptTouchEvent来拦截处理。 - 返回super.dispatchTouchEvent时,由onInterceptTouchEvent来决定事件的流向
- 返回false时,不会继续分发事件,自己内部只处理了ACTION_DOWN
- 返回true时,不会继续分发事件,自己内部处理了所有事件(ACTION_DOWN,ACTION_MOVE,ACTION_UP)
2、onInterceptTouchEvent作用:拦截事件,用来决定事件是否传向子View - 返回true时,拦截后交给自己的onTouchEvent处理
- 返回false时,拦截后交给子View来处理
3、onTouchEvent作用:事件最终到达这个方法 - 返回true时,内部处理所有的事件
- 返回false时,事件会向上传递,由onToucEvent来接受,如果最上面View中的onTouchEvent也返回false的话,那么事件就会消失。
Android官方文档上:
onInterceptTouchEvent()与onTouchEvent()的机制:
- down事件首先会传递到onInterceptTouchEvent()方法
- 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理
- 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
- 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理
- 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
这是摘自网络: More: 1. 一个事件必然从ACTION_DOWN开始,所以当某一个控件处理了一个ACTION_DOWN事件,可以理解直到下一个ACTION_DOWN之前所有的触摸事件都应当由该控件(target)进行处理。 2. 对于各种listener,显然是由android系统进行处理的。所以Super.onTouchEvent()应当放在子类的该函数的第一行,可以优先保证系统的方法不会被自定义的操作截取而导致没有机会执行。 3. 牢记一个原则,所有的touch事件都是从父容器开始向下传递的,呈U字形 (1) 父容器(类型为 <? Extends ViewGroup>) onInterceptTouchEvent接收到事件,如果return false,转步骤(2),否则转 步骤(3) (2) 父容器在该位置(ACTION_DOWN发生的位置)存在子控件,如果子控件类型为 <? Extends ViewGroup>,此时该子控件成为父容器,转步骤(1),如果子控件为普通view,即 不是viewgroup的子类,使用子控件转步骤(3),如果不存在子控件,使用父容器转步骤(3) (3) 该touch事件交给该控件的onTouchEvent进行响应,如果return false,当其存在父容器时,事件传递给父容器,转步骤(3)。当不存在父容器时,该事件被丢弃。如果return true,表示事件被消费了,此touch事件终止。
深圳校区除了全国独有问答网,就业老师面试服务,还有更多神秘惊喜等着你,咨询热线:0755-66689855
|