先把结论放在前面:CoordinatorLayout 与 NestedScrollView 是一套协议的两端——CoordinatorLayout 实现NestedScrollingParent,NestedScrollView 实现NestedScrollingChild,两者通过"滚动量先问父级、父级消费一部分、把剩余量回传子级"的协商机制实现联动。会用AppBarLayout + CollapsingToolbarLayout只是会用;能讲清这套"协商式"协议与传统的"拦截式"事件分发有何不同,才是这题要答的。
这题的区分度在于机制层:面试官问"为什么 AppBarLayout 能折叠",答"因为它监听了滚动事件"是不及格的;答"因为子容器把 dy 交给父级先消费,父级折叠完成后把未消费的部分还给子级继续滚",才是机制层的答案。
协商式滚动 vs 拦截式事件分发
这是本篇最核心的一组对比:
| 维度 | 传统事件分发(onInterceptTouchEvent) | 嵌套滚动(NestedScrolling) |
|---|---|---|
| 协作方式 | 父容器抢占事件,可中断子容器 | 父容器受邀 |