NestedScrollingParent
因为内控件是发起者, 所以外控件的大部分方法都是被内控件的对应方法回调的.
onStartNestedScroll : 对应startNestedScroll, 内控件通过调用外控件的这个方法来确定外控件是否接收滑动信息.
onNestedScrollAccepted : 当外控件确定接收滑动信息后该方法被回调, 可以让外控件针对嵌套滑动做一些前期工作.
onNestedPreScroll : 关键方法, 接收内控件处理滑动前的滑动距离信息, 在这里外控件可以优先响应滑动操作, 消耗部分或者全部滑动距离.
onNestedScroll : 关键方法, 接收内控件处理完滑动后的滑动距离信息, 在这里外控件可以选择是否处理剩余的滑动距离.
onStopNestedScroll : 对应stopNestedScroll, 用来做一些收尾工作.
getNestedScrollAxes : 返回嵌套滑动的方向, 区分横向滑动和竖向滑动, 作用不大 onNestedPreFling和onNestedFling : 同上略
外控件通过onNestedPreScroll和onNestedScroll来接收内控件响应滑动前后的滑动距离信息.
再次指出, 这两个方法是实现嵌套滑动效果的关键方法.
3
从NestedScrollView看嵌套机制
说完上面一大通, 终于可以开始分析源码来了解嵌套滑动机制起作用的具体逻辑了.
NestedScrollView简单地说就是支持嵌套滑动的ScrollView, 内部逻辑简单, 而且它既可以是内控件, 也可以是外控件, 所以选择分析它来了解嵌套滑动机制.
注意 : 因为NestedScrollingChildHelper和NestedScrollingParent这两个辅助类的实现跟View和ViewGroup中的对应方法是一样的, 而且View和ViewGroup的源码没有使用兼容类, 所以下面分析相关方法的时候源码都使用View和ViewGroup中的代码.
上面已经说了嵌套滑动是从startNestedScroll开始, 所以先看看哪里调用了这个方法, 在源码里一搜就能知道有两个地方调用了这个方法.
onInterceptTouchEvent中ACTION_DOWN的情况
onTouchEvent中ACTION_DOWN的情况
因为ACTION_DOWN是滑动操作的开始事件, 所以当接收到这个事件的时候尝试找对应的外控件. 只有找到了外控件才有后续的嵌套滑动的逻辑发生.
关于NestedScrollView在这里的实现其实有个奇怪的地方, 提出一个问题, 不感兴趣的可以直接跳过这段.
既然内控件是发起者, 为什么要