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事件分发机制,参考事件分发
参考ScrollHelper类的处理逻辑,并可以借助其与ScrollingView接口实现较为通用的滚动逻辑。
实现View或者ViewGroup接口,参考事件分发
实现NestedScrollingParent接口
public class NestedScrollView extends ScrollView
implements Component.TouchEventListener, ViewGroup, NestedScrollingParent
// 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();
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。