Android onInterceptTouchEvent 和 onTouchEvent

onInterceptTouchEvent方法是ViewGroup的方法,也就是全部的容器都将继承该方法。此方法设计的意图是为了在父容器将touch事件传递给子控件的时候能够统一控制。好比button就没有该方法,很明显,button不可能拥有子控件。 android

onTouchEvent方法是view的方法,当该控件接收到touch事件时,此方法会被执行。每个touch事件老是从ACTION_DOWN事件开始,ACTION_UP结束。Touchevent 中,返回值是 true ,则说明消耗掉了这个事件,返回值是 false ,则没有消耗掉,会继续传递下去 函数

Touch事件几大原则: spa

1.若是在某个层级没有处理ACTION_DOWN事件,那么该层就再也收不到后续的Touch事件了直到下一次ACTION_DOWN事件。 设计

   说明:a.某个层级没有处理某个事件指的是它以及它的子View都没有处理该事件。 继承

         b.这条规则不适用于Activity层(它是顶层),它们能够收到每个Touch事件。 事件

         c.若是没有处理ACTION_MOVE这类事件,不会有任何影响。 get

2.若是ACTION_DOWN事件发生在某个View的范围以内,则后续的ACTION_MOVEACTION_UPACTION_CANCEL等事件都将被发往该View,即便事件已经出界了。 it

3.第一根按下的手指触发ACTION_DOWN事件,以后按下的手指触发ACTION_POINTER_DOWN事件,中间起来的手指触发ACTION_POINTER_UP事件,最后起来的手指触发ACTION_UP事件(即便它不是触发ACTION_DOWN事件的那根手指)。 event

4.pointer id能够用于跟踪手指,从按下的那个时刻起pointer id生效,直至起来的那一刻失效,这之间维持不变。 容器

5.若是一个ACTION_DOWN事件被父View拦截了,则任何子View不会再收到任何Touch事件了(这符合第1点的要求)。

6.若是一个非ACTION_DOWN事件被父View拦截了,则那些上次处理了ACTION_DOWN事件的子View会收到一个ACTION_CANCEL事件,以后不会再收到任何Touch事件了,即便父View再也不拦截后续的Touch事件。

7.若是父View决定处理Touch事件或者子View没有处理Touch事件,则父View按照普通View的处理方式处理Touch事件,不然它根本不处理Touch事件(它只负责分发)。

8.若是父ViewonInterceptTouchEvent中拦截了事件,则onInterceptTouchEvent中不会再收到Touch事件了,事件被直接交给它本身处理(按照普通View的处理方式)。

 

从手指开始触摸屏幕开始,首先获得touch事件的必然是最外层的容器,此时做为父容器,其首先触发的是onInterceptTouchEvent,该方法提供一次能够拦截子控件的触摸事件的机会。一样的返回true表示消费了该事件,此时该事件会传递至该容器的onTouchEvent方法。

若是返回false,那么则继续传递给在该触摸位置的子控件(好比一个RelativeLayout),若是子控件也不处理则继续传递给最后一个子控件,当最后一个子控件依然返回false,那么该事件则冒泡传递给父控件,(冒泡想必写过js的同窗很熟悉)。

 

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事件终止。

相关文章
相关标签/搜索