滑动的处理
在前一篇文章 Android NestedScrolling解决滑动冲突问题(1) - 相关接口 中,我们分析了解决滑动冲突问题的 NestedScroll 接口,也给出了解决此类问题的一般性方案:
NestedScrollingChild侧
NestedScrollingChild
(后面简称NC)处理MotionEvent
(一般在onTouchEvent
中,如果是ViewGroup
还要注意onInterceptTouchEvent
的处理,拦截滑动相关的MotionEvent
事件),分析用户滑动操作。
在滑动开始时,调用startNestedScroll
找到联动此次滑动的NestedScrollingParent
(后面简称NP)。
对于每次用户交互产生的滑动距离,先调用dispatchNestedPreScroll
,询问联动NP是否预先处理此滑动,如果NP预先处理了,会给出消耗掉的滑动距离。
对于NP预处理剩下的滑动距离,NC决定自己是否处理部分或者全部距离(自己的滑动)。
如果NC自己滚动之后,还剩下部分滑动距离,则调用dispatchNestedScroll
让NP自行选择是否处理最后剩下的这些滑动距离。
用户交互停止滑动,调用stopNestedScroll
通知NC停止滑动联动。
NestedScrollingParent侧
在onStartNestedScroll
中,决定是否与此次NC发起的滑动请求联动,如果决定联动,返回true
,否则返回false
。返回true
之后,会收到onNestedScrollAccepted
回调,表示NC同意与其联动,可以开始做初始化操作了;返回false之后,后面的NC联动操作不会通知此NestedScrollingParent
(不会收到后续的onNestedPreScroll
、onNestedScroll
、onStopNestedScroll
等)。
在onNestedPreScroll<