ViewGroup.onInterceptTouchEvent() onTouchEvent()
时间:2010-10-20 来源:flyfordream_h
ViewGroup类的onInterceptTouchEvent(MotionEvent ev)分析
实现这个方法去拦截所有的屏幕手势动作事件。这允许你去查看这些事件当它们被分发到ViewGroup的下一级view,并且在任何一点能拥有当前的手势。
使用这个方法要注意:它与View.onTouchEvent(MotionEvent)方法有相当复杂的交互,使用它必须要同样正确的实现这个方法。事件将会以下面的顺序到达:
1、 你将会在这里接收到down事件
2、 Down事件或者被该viewGroup的一个child处理,或者将被给到viewGroup自己的onTouchEvent()方法来处理。这意味着你应该实现onTouchEvent()从而可以返回true,所以你将继续看到剩余的手势(而不是寻找一个parent view去处理它)。并且,通过从onTouchEvent()返回true,你将不会在onInterceptTouchEvent()中接收到以下任何事件并且所有触屏处理必须在onTouchEvent()中像正常情况一样发生。
3、 只要从onInterceptTouchEvent()返回false,接下来的每一个事件(截止到up并包括最后一个up)将会首先被传递到这里,然后到目标view的onTouchEvent()。
4、 如果从onInterceptTouchEvent()返回true,你将不会接收到任何以下事件:目标view将会接收到相同的事件但是带着ACTION_CANCEL的动作,所有以后的事件将会被传递到你的onTouchEvent()方法中并且不再在这里出现。
返回值:返回true从childernview那里偷取动作事件并通过onTouchEvent()把它们分发到这个ViewGroup。当前的目标view将会接收到一个ACTION_CANCEL事件,并且将来也不会再有消息被传递到这里。
ViewGroup类的onTouchEvent(MotionEvent event)分析
实现这个方法去处理触屏事件
如果事件被处理则返回true,没有被处理则返回false
基本的规则是:
1. down事件首先会传递到onInterceptTouchEvent()方法
2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。