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. 所以这三个方法里都有按下到抬起的一系列事件