这个机制是帮助我们处理滚动一些事件的,
但是从源码上我们可以思考,其实更好的说法应该是处理触摸事件,不仅仅滚动
因为其实里面是 子View 在回调给了 父View
- NestedScrollingParent
- NestedScrollingChild
- NestedScrollingParentHelper
- NestedScrollingChildHelper
NestedScrollingParent
子View一定要 setNestedScrollingEnabled 为true
按首次调用排序
方法:
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes);`
1 2 3
比如返回`(nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0` 说明可以接收垂直方向的事件,才会允许接下来的`NestedScrollingParent`的其余动作
onNestedScrollAccepted(View child, View target, int axes)
这个方法一般是记录 axes
如果使用
NestedScrollingParentHelper
可以用:下面方法1 2 3 4 5 6 7
/** * 一般记录 axes * */ @Override public void onNestedScrollAccepted(View child, View target, int axes) { nestedScrollingParentHelper.onNestedScrollAccepted(child , target ,axes); }
getNestedScrollAxes
1 2 3 4 5 6 7
这个方法一般用不到,但是自己重写制定View的时候 可以用到 @Override public int getNestedScrollAxes() { // return super.getNestedScrollAxes(); return nestedScrollingParentHelper.getNestedScrollAxes(); }
onNestedPreScroll(target , dx , dy , consumed)
1 2 3 4 5 6 7 8 9 10 11
1.target 目标 2.dx 滑动的x坐标 3.dy 滑动的y坐标 4.comsumed 需要消费的多少 通过名字就可以找到 **pre** 准备 就知道是准备滑动的时候 , 滚动前 通常是子Viwe `dispatchNestedPreScroll`调用
onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed)
1 2 3 4 5
一般子view开始滚动的时候会触发该方法 , 滚动后 同理: 子View中 dispatchNestedScroll 参数:也不多做介绍
boolean super.onNestedPreFling(target , velocityX , velocityY)
1 2 3
也是同理 返回子View中 `dispatchNestedPreFling` 这个方法是fling前 允不允许 返回true 运行在fling 否则不允许
super.onNestedPreFling(target , velocityX , velocityY)
1 2
对应子View中 `dispatchNestedPreFling` 可以处理fling 事件
NestedScrollingChild
dispatchNestedFling(float velocityX, float velocityY, boolean consumed)
1
向嵌套滚动父级派发一个投掷
dispatchNestedPreFling(float velocityX, float velocityY)
1
在此视图处理它之前,将嵌套分派给嵌套的滚动父级。
dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow)
在该视图消耗其任何部分之前,调度正在进行的嵌套滚动的一个步骤。
dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow)
1
分派正在进行的嵌套滚动的一个步骤。
hasNestedScrollingParent()
1
如果此视图具有嵌套滚动父级,则返回true。
isNestedScrollingEnabled()
1
如果对此视图启用嵌套滚动,则返回true。
setNestedScrollingEnabled(boolean enabled)
1
启用或禁用此视图的嵌套滚动。
startNestedScroll(int axes)
1
沿给定轴开始可嵌套滚动操作。
stopNestedScroll()
1
停止正在进行的嵌套滚动。
NestedScrollingParentHelper
getNestedScrollAxes()
1
返回此ViewGroup的嵌套滚动的当前轴。
onNestedScrollAccepted(View child, View target, int axes)
1
当由ViewGroup接受由子视图启动的嵌套滚动操作时调用。
onNestedScrollAccepted(View child, View target, int axes, int type)
1
当由ViewGroup接受由子视图启动的嵌套滚动操作时调用。
onStopNestedScroll(View target, int type)
1
反应到嵌套滚动操作结束。
onStopNestedScroll(View target)
1
反应到嵌套滚动操作结束。