ohos扩展包——Nested Scrolling
Nested Scrolling
Nested Scrolling主要包含NestedScrollingChild、NestedScrollingParent两个接口,以及NestedScrollingChildHelper、NestedScrollingParentHelper两个帮助类。
Nested Scrolling的两个接口综合了Android中的NestedScrollingChild1、2、3以及NestedScrollingParent1、2、3接口。
原理
在子组件(NestedScrollingChild)的滚动事件中,优先询问父组件(NestedScrollingParent)是否需要消耗子组件的滚动事件,以及需要消耗多少距离,并作出相应的处理。子组件再根据剩余的距离作出处理。
使用
整体使用上与Android没有区别,但是需要注意的是:NestedScrollingChild接口一般已经由系统控件实现了,很少需要我们去自行实现。因为NestedScrollingChild的分发逻辑需要侵入到控件的滚动处理逻辑中,部分系统控件已经帮我们处理好了(比如ScrollView、RecyclerView等)。
但是在ohos中,我们无法重写系统控件的触摸事件,只能通过setTouchListener来设置一个回调,这意味着我们无法侵入到ohos系统控件原有的滚动处理逻辑内。因此我们需要重写控件的滚动逻辑(可以借助ScrollHelper类),并在合适的时机调用NestedScrollingChild(具体逻辑由NestedScrollingChildHelper实现)中的dispatch系列方法将事件分发到父组件
注意:所有实现NestedScrollingChild与NestedScrollingParent的控件,均要实现View或者ViewGroup接口,实现dispatchTouchEvent事件分发机制,参考事件分发
NestedScrollingChild
参考ScrollHelper类的处理逻辑,并可以借助其与ScrollingView接口实现较为通用的滚动逻辑。
NestedScrollingParent
-
实现View或者ViewGroup接口,参考事件分发
-
实现NestedScrollingParent接口
public class NestedScrollView extends ScrollView implements Component.TouchEventListener, ViewGroup, NestedScrollingParent
- 在NestedScrollingParent的部分函数中,调用NestedScrollingParentHelper的同名函数,并在剩余函数中根据需求自行实现逻辑。
// NestedScrollingParent @Override public boolean onStartNestedScroll(Component child, Component target, int axes, int type) { return true; // 需要自行实现逻辑 } @Override public void onNestedScrollAccepted(Component child, Component target, int axes, int type) { mParentHelper.onNestedScrollAccepted(child, target, axes, type); } @Override public void onStopNestedScroll(Component target, int type) { mParentHelper.onStopNestedScroll(target, type); } @Override public void onNestedScroll(Component target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type, int[] consumed) { // 需要自行实现逻辑 } @Override public void onNestedPreScroll(Component target, int dx, int dy, int[] consumed, int type) { // 需要自行实现逻辑 } @Override public boolean onNestedFling(Component target, float velocityX, float velocityY, boolean consumed) { // 需要自行实现逻辑 return false; } @Override public boolean onNestedPreFling(Component target, float velocityX, float velocityY) { // 需要自行实现逻辑 return false; } @Override public int getNestedScrollAxes() { return mParentHelper.getNestedScrollAxes(); }
- 更详细的说明,可以参考其他Android相关的教程