Android touch事件的分发

2021-01-12  本文已影响0人  stoolman

Android touch事件的分发分为几个层次:

dispatchTouchEvent

这个是事件分发的核心接口,整个 View 之间的事件分发,实质上就是一个大的递归函数,而这个递归函数就是 dispatchTouchEvent 方法。在这个递归的过程中会适时调用 onInterceptTouchEvent (viewgroup)来拦截事件,或者调用 onTouchEvent 方法来处理事件。

整个分发逻辑可以这么概括:

touchEvent拦截

ViewGroup#dispatchTouchEvent.png

从源码可以看到,当action为ACTION_DOWN时或者没有mFirstTouchTarget 不为 null时(子ViewdispatchTouchEvent 返回true)才会调用onInterceptTouchEvent 判断是否拦截;

可以推导出,一次连续touchEvent事件(down ...move...up)当父View拦截了touchEvent,那么后续事件将不会再去判断是否拦截(交由该view处理)。

注意,如果不拦截down,在move事件中拦截,则子view会收到cancel事件,后续事件也不会再去判断是否拦截,直接交由父View处理;、

事件分发至子view

如果没有拦截,则将事件分发给子 View 继续处理,如果子 View 将此次事件捕获,则将 mFirstTouchTarget 赋值给捕获 touch 事件的 View。

源码内容过多,此处总结主要逻辑:

根据mFirstTouchTarget再次分发

总结

上一篇 下一篇

猜你喜欢

热点阅读