HarmonyOS鸿蒙NEXT Scroll容器嵌套多种组件事件处理案例
HarmonyOS鸿蒙NEXT Scroll容器嵌套多种组件事件处理案例 HarmonyOS Next应用开发案例(持续更新中……)
本案例完整代码,请访问:代码仓库
本案例已上架 HarmonyOS NEXT 开源组件市场,如需获取或移植该案例,可安装此插件。开发者可使用插件获取鸿蒙组件,添加到业务代码中直接编译运行。
介绍
本示例适用于Scroll容器嵌套多组件事件处理场景:当需要一个父容器Scroll内嵌套web、List,当父子的滚动手势冲突时,此时希望父容器的滚动优先级最高,即实现子组件的偏移量都由父容器统一派发,实现滚动任一子组件流畅滚动到父容器顶/底的效果。例如本案例的新闻浏览界面,父组件Scroll嵌套了新闻内容与评论区(Web实现新闻内容,List实现评论区),通过禁用web和list组件滚动手势,再由父组件Scroll统一计算派发偏移量,达到一种web的滚动和list组件滚动能无缝衔接,像同一个滚动组件滚动效果。
效果图预览

使用说明
- 点击Scroll容器嵌套多种组件事件处理案例。
- 页面向下滚动直到页面底部,无卡顿现象。
- 从页面底部向上滚动直到页面顶部,无卡顿现象。
实现思路
概述:使用Scroll嵌套Web和List组件实现。Scroll作为父组件响应滚动手势,Web和List组件禁用滚动手势,滚动偏移量由父组件Scroll给Web和List组件派发。
即通过在Scroll.onScrollFrameBegin()每帧开始滚动时触发,将Scroll返回的实际滚动量的offset,通过scrollBy(0, offset)方法,将Scroll的偏移量派发给Web、List。
滚动偏移量派发逻辑:
- 
手指向上划动(页面下滑): - 如果Web没有滚动到底部,Scroll将滚动偏移量派发给Web,Scroll组件自身不滚动。
- 如果Web滚动到底部,Scroll没有滚动到底部,则Scroll自身滚动,不给Web和List派发滚动偏移量。
- 如果Scroll滚动到底部,则滚动偏移量派发给List,Scroll自身不滚动。
 
- 
手指向下划动(页面上滑): - 如果List没有滚动到顶部,则Scroll将滚动偏移量派发给List,Scroll自身不滚动。
- 如果List滚动到顶部,Scroll没有滚动到顶部,则Scroll自身滚动,不给Web和List派发滚动偏移量。
- 如果Scroll滚动到顶部,则滚动偏移量派发给Web,Scroll自身不滚动。
 
高性能知识点
- 动态加载数据场景可以使用 LazyForEach 遍历数据。
- 本例使用扁平化布局优化嵌套层级,建议采用相对布局 RelativeContainer进行扁平化布局,有效减少容器的嵌套层级,减少组件的创建时间。
工程结构 & 模块类型
containernestedslide                            // har类型
|---src/main/ets/view
|   |---CommentInputDialog.ets                  // 视图层-输入评论弹窗组件
|   |---CommentPage.ets                         // 视图层-评论组件
|   |---NewsDetailPage.ets                      // 视图层-主页
|   |---Scroller.ets                            // 视图层-父容器偏移量派发组件
|---model
|   |---TextFlowModel.ets                       // 模型层-评论数据类 
|---mock
|   |---DetailData.ets                          // 模拟数据模块
模块依赖
[@ohos/routermodule(动态路由)](https://gitee.com/harmonyos-cases/cases/tree/master/CommonAppDevelopment/common/routermodule)
参考资料
- Scroll
- 手势拦截增强
- [@ohos.web.webview (Webview)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-webview-V5)
更多关于HarmonyOS鸿蒙NEXT Scroll容器嵌套多种组件事件处理案例的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙NEXT Scroll容器嵌套多种组件事件处理案例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙NEXT中,Scroll容器嵌套多种组件时,事件处理需要注意以下几点:
事件分发机制
鸿蒙系统采用事件分发机制来管理用户交互。Scroll容器作为父容器,负责管理子组件的事件分发。当用户触控屏幕时,事件首先传递给Scroll容器,然后根据子组件的位置和层级进行分发。
事件拦截
在嵌套组件中,如果Scroll容器需要拦截某些事件(如滑动事件),可以通过重写onInterceptTouchEvent方法来实现。这样可以确保Scroll容器在接收到滑动事件时优先处理,而不是传递给子组件。
事件消费
子组件可以通过重写onTouchEvent方法来消费事件。如果子组件消费了事件,事件将不再向上传递给父容器。例如,如果子组件处理了点击事件,Scroll容器将不会接收到该事件。
事件冲突处理
在嵌套多种组件时,可能会出现事件冲突。例如,子组件需要处理点击事件,而Scroll容器需要处理滑动事件。可以通过调整事件的消费顺序或使用requestDisallowInterceptTouchEvent方法来避免冲突。
示例代码
class MyScrollContainer extends ScrollContainer {
    onInterceptTouchEvent(event: TouchEvent): boolean {
        // 拦截滑动事件
        return true;
    }
}
class MyComponent extends Component {
    onTouchEvent(event: TouchEvent): boolean {
        // 处理点击事件
        return true;
    }
}
// 在布局中使用
let scrollContainer = new MyScrollContainer();
let myComponent = new MyComponent();
scrollContainer.addComponent(myComponent);
 
        
       
                   
                   
                  

