3 Star 44 Fork 10

Ryan Zhu / OhosExtension

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
NestedScrolling.md 3.54 KB
一键复制 编辑 原始数据 按行查看 历史
Ryan Zhu 提交于 2021-07-01 23:29 . update readme

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

  1. 实现View或者ViewGroup接口,参考事件分发

  2. 实现NestedScrollingParent接口

public class NestedScrollView extends ScrollView
        implements Component.TouchEventListener, ViewGroup, NestedScrollingParent
  1. 在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();
    }
  1. 更详细的说明,可以参考其他Android相关的教程
Java
1
https://gitee.com/thoseyears/ohos-extension.git
git@gitee.com:thoseyears/ohos-extension.git
thoseyears
ohos-extension
OhosExtension
master

搜索帮助