ohos扩展包——Nested Scrolling

jacksky
发布于 2021-9-29 18:27
浏览
0收藏

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
  3. 在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();
        }​
  4. 更详细的说明,可以参考其他Android相关的教程

 

已于2021-9-29 18:27:36修改
收藏
回复
举报
回复
    相关推荐