图解onInterceptTouchEvent , onTouchEvent及onTouch区别

来源:互联网 发布:大连光洋 知乎 编辑:程序博客网 时间:2024/05/16 18:16

onInterceptTouchEvent : intercept 词意为拦截, 此事件只有ViewGroup才有(例如LinearLayout),是从父布局开始一步步传到子布局 , 直到拦截(也就是返回值为true)或者传到没有此事件的view(例如TextView); 返回值为false 则继续传,返回值为true , 则执行该控件中的onTouchEvent 或 onTouch方法.

onTouchEvent : 此事件只要是view就会存在 , TextView 和 LinearLayout 都存在 此事件. 此事件的传递方式是 从子布局一步步传到父布局,直到拦截或者传到头.

onTouch : 为 OnTouchListener 接口中的方法, view实现该接口后的 事件的传递方式也和 onTouchEvent 的方式一样.


假设三个View都实现了onTouchListener接口且返回值都为false, 那么ACTION_DOWN 的 触摸事件会按照图所示会依次执行这些方法.


若不想让自己的子View接收触摸事件 则需要在 父布局的onInterceptTouchEvent当中 返回true , 这样父布局会执行 父布局当前的 onTouch方法,若父布局的onTouch 返回还是为false则继续执行onTouchEvent方法 , 若返回true则会 ACTION_DOWN的触摸事件到此结束, 返回false , 就和上图显示的方向一样 , 接着传递到 此布局的父布局 onTouch方法,


在没有实现onTouchListener接口时也一样,按顺序判断.

--------------------------------------------------------------------------------------------------------------------------------------------

接着是其他触摸事件时的方法执行顺序

在图二的情况下ACTION_DOWN的点击事件顺序和图中一样, 但是他后续的ACTION_MOVE , ACTION_UP 并不会去执行 onInterceptTouchEvent , 而是 按照onTouch和onTouchEvent,两个方法一起执行(顺序还是onTouch优先),也就是说你触摸屏幕到抬手 拦截到onInterceptTouchEvent 布局 只会执行该事件一次 . 

 

而在上图这种情况下 , ACTION_DOWN时 他会先执行拦截到onInterceptTouchEvent 布局的 onInterceptTouchEvent 方法, 在执行onTouch方法, 在ACTION_MOVE,ACTION_UP 情况下就会一直执行onTouch方法 , 因为在  onTouch当中的返回值为true 不会执行 onTouchEvent方法 . 


最后 ViewGroup的 onInterceptTouchEvent 的返回值默认为 false. 除非你自定义View 去重写他的方法 , 使其可以动态的去拦截 , 例如你父布局可以滑动翻页,你的子布局当中有多个可点击的按钮 , 这时候你需要在 onInterceptTouchEvent 判断一下 他的触摸事件时 滑动页面 还是点击按钮 , 若是滑动页面则在父布局进行拦截 , 不传给自布局 , 若是想要点击按钮 , 则返回false 把触摸事件传递到子布局当中去.




2 0