我们对触摸事件的处理,印象最深的就是两个方法: onInterceptTouchEvent() 和 onTouchEvent().
其中,
1. onInterceptTouchEvent()是ViewGroup中的方法, 返回值决定该事件是否需要被 intercept
2. onTouchEvent()是 ViewGroup 和 View,以及Activity都有的 用来处理触摸事件的方法。但是并不是所有的onTouchEvent都会被调用。
具体的分发处理的过程见以下分析:
1. onInterceptTouchEvent
onInterceptTouchEvent 是ViewGroup 及其相关子类(LinearLayout,FrameLayout等) 中的方法。实现代码为:
frameworks/base/core/java/android/view/ViewGroup.java:copy
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
返回值的意义如下,
true: 1. 该事件不再传递给子View处理,而是由当前ViewGroup的onTouchEvent处理。
2. 该ViewGroup的onInterceptTouchEvent,不再接受UP和Move事件。
false:继续分发该事件给子View。子View当然也可能是一个ViewGroup。
2. onTouchEvent
有一个层次的关系如下:
Activity ---> ViewGroup---> View. (按照相反的优先级处理事件)
假设ViewGroup没有在onInterceptTouch中返回true拦截该事件(拦截后就不会分发给View), 传递事件到View处理,则响应流程如下:
View.onTouchEvent:
返回 true: 1. View(这里代指末端的View) 处理该事件,ViewGroup的onTouchEvent不再处理。
2. ViewGroup的onInterceptTouchEvent还是继续接收 触摸消息的(特指后续的 MOVE, UP事件)(此处仍有一些疑惑,需要代码调试)
返回false: 1. View返回false, 则ViewGroup的onTouchEvent会处理该事件。
2. ViewGroup返回false, 则Activity的onTouchEvent会处理该事件。
还需要排查错误和扩展相关。