Android事件传递机制解析

Android 的事件传递机制,说白了就是一场点击事件的“接力赛”。父布局能不能拦截,子视图会不会接球,全靠两个关键方法:onInterceptTouchEventonTouchEvent。你只要搞清楚谁先响应、谁能拦下来,再配合日志观察,一下子就通透了。

Android 的事件链机制挺好理解的,事件从最外层的 ViewGroup 往里传,一层层问“你要不要?你要不要?”。用onInterceptTouchEvent拦下来就自己,不拦就继续往子视图传。比如 A 是父容器,B、C、D 是子控件,那点击 B 会先问 A 拦不拦,再看 B 接不接。

事件拦截这个环节,重点就是看你想不想“抢戏”。在onInterceptTouchEvent里返回true,你就把事件拦走,自己来;返回false,就让子控件继续“演”。如果你做滑动冲突,经常会在这儿搞点逻辑判断。

到了事件阶段,就是看onTouchEvent里谁响应了。响应了,事件就不传了;没人,才会“泡泡回去”让上层试试看。日志输出是个好帮手,点一下就能看到事件走了哪几层。

像自定义控件、复杂嵌套布局这些场景,搞清楚事件传递就关键。不然一个按钮怎么点都没反应,是不是父容器“截胡”了?嗯,调试的时候记得多打日志,比如Log.d("TouchEvent", "A 拦了吗")这种。

如果你对事件机制还不是熟,可以配合这个事件分发示例跑一下,点几个 View 看看谁了事件,会有一种“哦~原来是这么回事”的恍然大悟。

要是你做的是RecyclerView嵌套滑动、ViewPager 拦截点击这些“高阶玩法”,那就更得搞清楚事件传递链的每一环了,搞清楚就事半功倍了。

zip 文件大小:2.74MB