在android开发中,要定义比较复杂的touch操作,必须清楚touch事件的处理流程。
- View都有onTouchEvent函数,用于处理touch事件。
- onTouchEvent返回false,表示该View不希望获得touch事件的焦点,不处理后续的touch事件;
onTouchEvent返回true,表示该View希望获得touch事件的焦点,继续处理后续的touch事件。 - ViewGroup是View的子类,除了onTouchEvent外,还有onInterceptTouchEvent
onInterceptTouchEvent返回false,表示该ViewGroup希望把touch事件传给自己的子视图。
onInterceptTouchEvent返回true,表示该ViewGroup希望拦截touch事件,不把事件传给自己的子视图,而是传给自己的onTouchEvent函数。
如果之前其子视图已经获得touch事件的焦点,当ViewGroup的onInterceptTouchEvent返回true,拦截了touch事件,会向子视图传一个MotionEvent.ACTION_CANCEL事件,通知之前获得焦点的子视图,它的焦点已被拦截,做收尾工作。 - 如果已经获得touch事件焦点的View希望从此被拦截,可以调用
getParent().requestDisallowInterceptTouchEvent(true)
通知其父视图不要拦截它的touch事件。
如下图: