Android中事件分发的流程是,Activity->window->DecorView->然后开始遍历子View和ViewGroup的过程,此过程类似于,有一件事过来,首先到相关事件负责人那里,然后逐层,往下边员工传递,在中间过程中有某一次处理了,则下层就无法收到该事件,相当于事件分发中的拦截过程。
主要涉及的方法为
dispatchTounchEvent()->onInterceptTounchEvent()->onTounchEvent()
其中dispatchTounchEvent主要负责事件的分发
return true : View消费所有事件。
return false :停止分发,交由上层控件的onTouchEvent方法进行消费,如果本层控件是Activity,那么事件将被系统消费、处理。
super.dispatchTouchEvent(ev): 将事件交由本层的事件拦截onInterceptTouchEvent方法处理
onInterceptTounchEvent主要负责事件的拦截,此方法只有ViewGroup才有
return true: 对事件拦截,交由本层的onTouchEvent进行处理。
return false: 不拦截,分发到子View,由子View的dispatchTouchEvent方法处理。
super.onInterceptTouchEvent(ev):默认表示事件拦截,交由本层的onTouchEvent进行处理
onTounchEvent 理解事件的响应处理操作
return true: 表示onTouchEvent处理完事件后消费了此次事件。
return false: 不响应事件,不断的传递给上层的onTouchEvent方法处理,直到某个View的onTouchEvent返回true,则认为该事件被消费。如果到最顶层View还是返回false,那么该事件不消费,将交由Activity的onTouchEvent进行处理。
return: super.onTouchEvent,不响应事件,结果与return返回false一样
一)View的事件分发
View.dispatchTounchEvent()->View.onTounch()
返回false,则事件没有被消费掉,继续往下传递,返回true,则不再传递,不调用onClick()
二)ViewGroup的事件分发
ViewGroup.dispatchTouchEvent()->ViewGroup.onInterceptTouchEvent()
返回false为默认不拦截,返回true则拦截,不允许事件网子View传递
网友评论