touch触摸事件流程说明

有时候子控件会把父控件的监听事件给吃掉,那怎么处理这类这种情况呢?

流程: 从爷传到孙的时候,会执行dispatchTouchEvent方法往下传递,当孙子返回true消耗事件后,又会将true向上一层一层的返回到dispatchTouchEvent方法中作为despatchTouchEvent方法的返回值. 如果是false,自己的dispatchTouchEvent方法也就是返回false了,然后执行上一层的onTouchEvent方法,依次传递下去(因为onTouchEvent是在dispatchTouchEvent方法调用的)

中断子控件的接收,使得父控件能处理该事件,从而不被子控件吃掉该事件

重写该控件的onInterceptTouchEvent方法,然后对触摸进行判断处理,看中不中断往下传递,图中指的传递也就是执行dispatchTouchEvent方法

 

onInterceptTouchEvent与onTouchEvent出现的问题:onTouchEvent的第一个事件为move事件,按下事件执行不到
原因:当有个事件过来,先走onInterceptTouchEvent的按下,而按下返回的false,所以不会执行自己的按下事件,而是子控件的.
所以可以在执行onInterceptTouchEvent的按下事件时,需要去赋值于onTouchEvent的按下事件需要的数据(防止触摸解析出错)

 

dispatchTouchEvent这个方法为系统的,不可以重写,不然会有想不到的后果.(分派触摸事件)
事件传递机制流程:
1.view执行dispatchTouchEvent方法,开始分发事件, 上面图中所指的传递事件,就是执行这个方法
2.执行onInterceptTouchEvent方法 判断是否中断事件
3.执行onTouchEvent方法,处理触摸事件,该方法是在dispatchTouchEvent方法中调用的,所以不分发事件就执行不了onTouchEvent方法了.

 

getChildAt(2).dispatchTouchEvent(event);//讲触摸事件拷贝一份传给getChildAt(2).这样就可以两个控件同时执行该触摸事件

注意:

1.从按下到抬起才是一套完整的事件,当你在按下事件中返回false,那么这个控件将不会执行下面的任何事件(比如移动,抬起)

2.传递到View后按下事件肯定是会执行的,但是消不消耗这个事件那就得看你按下后返回的是什么值了(返回true代表消耗该事件,false代表不消耗)

先得清楚两个概念:1,Activity中只有分发和触摸方法  2.ViewGroup中有分发,中断,触摸方法,  3.View中只有分发和触摸方法  这些方法里的参数都是event.  所以这三个方法里都有按下到抬起的一系列事件

事件分发推荐文章

posted @ 2016-07-31 21:02  ts-android  阅读(821)  评论(0编辑  收藏  举报