前言:我们在开发中经常遇到多个view和viewGroup嵌套的问题,为了快速解决这类问题,开发者需要对view事件有一个交深的理解
1.1触摸类型
action_down 手指按下事件
action_move 手指滑动事件
action_up 手指抬起事件
一般手指抬起和按下事件是一定能监听到 move事件就不一定能监听到位
1.2事件传递的三个阶段对于最复杂的viewGroup来说
1.2.1 分发 dispatch 对应方法 dispatchTouchEvent方法,在android 系统中用来分发事件在在这个方法中根据某及实现来决定是直接消费事件还是分发事件,方法值返回super.dispatchTouchEvent表示继续分发该事件,如果当前视图是viewGroup及其子类那么就会调用拦截的方法
1.2.2 拦截对应事件为 public boolean onInterceptTouchEvent(MotionEvent ev)方法,这个方法只有在viewGroup中才有,其他都是不存在 这个方法表示是否进行拦截,如果返回true那就拦截该事件 返回false 就表示不对事件进行拦截继续传递个子view
1.2.3消费 对应的方法为 public boolean onTouchEvent(MotionEvent ev)表示消费该事件 如果这个方法返回true 表示当前view 可以处理事件,事件不会传递到父布局,返回false 表示不对事件进行拦截,需要传递给父视图的onTouchEvent方法进行处理
2.1 伪代码解释
public void dispatchTouchEvent(MotionEvent ev){
boolean consum=false;
if (onInterceptTouchEvent(ev)){
consume=onTouchEvent(ev)
}else {
consu=child.dispatchTouchEvent(ev);
}
}
3.1 结论
3.1.1触摸事件是从dispatchTouchEvent开始的,如果不是人为干预,则事件将依照嵌套层级向内传递,达到最内层的view 的时候,就由它来处理这个事件,如果最内层不能消费该事件,就会向外床底由最外层的onTouchEvent方法来处理
3.1.2如果事件在向内传递过程中被人为干预,就会导致事件提前被消费掉,内层的View将不会收到这个事件
3.1.3 触摸事件触发顺序先执行onTouch方法,最后才执行Onclick方法,如果onTouch返回true 那么点击事件将不会被触发
3.1.4 触摸事件一般是由Activity到ViewGroup 再到它的子类View
3.1.5viewGroup 通过onInterceptTouchEvent方法进行对事件的拦截,如果方法返回true那么就不会传递给子类
如果子类对方法消费了 那么将不会受到任何事件。