本文要叙述的是触摸事件在各种情况下的传递路径及逻辑
一、3个最基本的相关函数
- dispatchTouchEvent: 事件分发
- onInterceptTouchEvent:事件拦截
-
onTouchEvent:事件处理
view是没有onInterceptTouchEvent
函数的
在一个viewGroup中当事件传递到dispatchTouchEvent
函数的时候,它会先调用自己的onInterceptTouchEvent
函数,询问自己是否需要拦截这个事件。如果拦截则将事件交给自己的onTouchEvent
去处理并返回处理结果;如果不拦截,则会将事件通过调用子view的dispatchTouchEvent
传递给子view,判断返回值,如果是false还是要交给自己的onTouchEvent
viewGroup的dispatchTouchEvent
//只是大概这个意思,实际不是这么写的
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
if (onInterceptHoverEvent(ev)) {
return onTouchEvent(ev)
} else if (子view的dispatchTouchEvent) {
return true
} else {
return onTouchEvent(ev)
}
}
view的dispatchTouchEvent
//只是大概这个意思,实际不是这么写的
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
return onTouchEvent(ev)
}
二、viewGroup的触摸拦截
onInterceptTouchEvent
不用在第一时间就返回true,而是在任意事件里需要拦截的时候返回true即可。不过需要做好拦截之后工作的准备。
与之相关的还有一个函数parent.requestDisallowInterceptTouchEvent(true)
在子view不希望父view及祖先view执行的时候调用
网友评论