Android中的View可以分为两类:
一类是有子控件(Child View)的控件ViewGroup,比如LinearLayout
另一类就是没有child View的纯粹控件,例如ImageView
第一种控件有onInterceptTouchEvent()方法,如果在ViewGroup里覆写了该方法,那么就可以对各种touch事件加以拦截。功能如下:
1. down事件首先会传递到onInterceptTouchEvent()方法
2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
一个典型的例子就是DrawerLayout,它会在onInterceptTouchEvent()返回true,使得Activity的其他部分无法获取屏幕事件。
解决方案就是用Custom View 覆写 onInterceptTouchEvent()
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
((Main)mContext).onTouchEvent(ev);
return super.onInterceptTouchEvent(ev);
}