前言
日常开发过程中,遇到这种 Scroll 嵌套 List 列表滑动顶部悬停的场景十分常见,在鸿蒙开发时也正好实现了这个功能,本篇文章将带你一步步实现 Tab 顶部悬停的效果,建议点赞收藏!
实现效果
先看本文的最终实现效果如下:
需求分析
- 当整体向上滑动时,优先 Scroll 向上滑动。
- 当整体向下滑动时,优先 Scroll 向下滑动。
技术实现
- 首先需要实现基础页面布局,直接使用 Scroll 嵌套 List 布局。将 List 用 Tab 布局嵌套起来。
Scroll(this.scroller) {
Column() {
Text("内容")
.textAlign(TextAlign.Center)
.fontColor(Color.White)
.backgroundColor(this.themColor.value)
.width('100%')
.height('40%')
Tabs({ barPosition: BarPosition.Start }) {
TabContent() {
Column() {
Refresh({refreshing:false,friction:0,offset:0}){
List({ space: 10, scroller: this.scrollerForList }) {
ForEach(this.list, (item: string) = > {
ListItem() {
Text('ListItem' + item)
.width('100%')
.height('100%')
.borderRadius(15)
.fontSize(24)
.textAlign(TextAlign.Center)
.backgroundColor(Color.White)
}
.width('100%')
.height(100)
}, (item: string) = > item)
}
.pullToRefresh(true)
}
}.tabBar('你好')
TabContent() {
Column().width('100%').height('100%').backgroundColor('#007DFF')
}.tabBar('好的')
}
}
这里布局比较简单,使用两个 tab 用来切换布局。外层使用 Scroll 包裹,其中一个 tab 的里面使用 List 布局。相信这对大多人来说没有什么难度。
- 搭建好基础布局后,开始处理滑动冲突问题。根据实现效果来看,每次都是让外层的 Scroll 优先滑动,需要给 List 增加拦截处理,让每次滑动优先外层 Scroll 布局滑动,这里使用nestedScroll 属性的NestedScrollMode.PARENT_FIRST,即优先父布局滑动。
.nestedScroll({
scrollForward: NestedScrollMode.PARENT_FIRST,
scrollBackward: NestedScrollMode.PARENT_FIRST
})
- 这时不管怎么上下滑动,里面的 List 都不会滑动,只让外层的 Scroll 组件滑动。接下来处理 List 的滑动事件。
- 首先定义一个枚举类型,用来标记滑动位置。
enum ScrollPosition {
top,
center,
bottom
}
- 接下来分别实现 List 的 onReachStart,onReachEnd,onScrollFrameBegin 三个方法。这个比较容易理解,滑动道顶部时,记录当前位置为顶部,滑动底部时,记录当前位置为底部,onScrollFrameBegin 表示滑动过程中的回调,根据当前滑动位置和滑动偏移量来记录是否继续滑动。
.onReachStart(() = > {
this.listPosition = ScrollPosition.top
})
.onReachEnd(() = > {
this.listPosition = ScrollPosition.bottom
})
.onScrollFrameBegin((offset: number, state: ScrollState) = > {
if ((this.listPosition == ScrollPosition.top && offset <=0)||(this.listPosition == ScrollPosition.bottom && offset >=0)) {
return {offsetRemain :offset}
}
this.listPosition = ScrollPosition.center
return {offsetRemain:offset}
})
- 再看外层 Scroll 的滑动方法监听,同样也是分别实现这三种方法,不过注意onScrollFrameBegin 里面返回值和 List 的不同,当 Scroll 滑动到底部活着顶部时,Scroll 不再滑动,注意看返回值为 0,否则 Scroll 才滑动。
.onReachStart(() = > {
this.listPosition = ScrollPosition.top
})
.onReachEnd(() = > {
this.listPosition = ScrollPosition.bottom
})
.onScrollFrameBegin((offset: number, _: ScrollState) = > {
if ((this.listPosition == ScrollPosition.top && offset <= 0) || (
this.listPosition == ScrollPosition.bottom && offset >= 0)
) {
return { offsetRemain: 0 }
}
//不在底部
this.listPosition = ScrollPosition.center
return { offsetRemain: offset }
})
- 根据 List 组件和 Scroll 组件的滑动监听,用来判断哪种状态下 Scroll 优先滑动,当 Scroll 滑动到底部活顶部时,通过返回值赋值为 0 ,阻止 Scroll 滑动,将滑动事件交个内部的 List 滑动。注意 List 通过设置nestedScroll 将滑动事件优先让外层 Scroll 处理。所以一开始是外层的 Scroll 先滑动。
总结
本文主要是根据实际需求实现的滑动效果,每次都优先让 Scroll 滑动,还有更多的滑动场景都可以用这种方式的思路解决,主要通过不同的判断条件即可实现。例如向下滑动时优先让 List 滑动,然后再让 Scroll 滑动。学会的小伙伴赶紧动手试试吧!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
鸿蒙
+关注
关注
60文章
3075浏览量
46285 -
HarmonyOS
+关注
关注
80文章
2157浏览量
36479
发布评论请先 登录
相关推荐
热点推荐
新品 | Tab5 Keyboard,Tab5 键盘输入扩展模块
Tab5KeyboardTab5Keyboard是一款专为Tab5打造的70键物理键盘输入扩展模块,可通过Tab5Ext.Port1直接连接主机,实现即插即用的输入体验。模块内置
AirCloud平台+excloud扩展库:核心功能实战应用!
AirCloud平台的配置灵活性与excloud扩展库的功能扩展性,通过实战应用得以充分体现。下面整理核心功能实战示例集,覆盖常见业务需求场景:如通过平台配置快速搭建高可用架构,借助e
滑动开关详解:类型、规格和应用
动作实现连接或断开。这篇简要的技术综述将研究滑动开关的工作原理,探讨其主要配置,并概述进行最优选择的电气和机械注意事项。 滑动开关的基础知识 [滑动开关]是一种机电元件,通过线性
【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能
【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言
HarmonyOS入门指南
上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。 2、开源框架 harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,
HarmonyOS实战: 城市选择功能的快速实现
最近在日常开发过程中,需要实现城市选择功能,同时支持模糊搜索。看似简单的功能动手实现起来却有很多难点。本篇文章详细记录开发过程中遇到的问题和对应的解决方法,希望能够帮助你,建议点赞收藏
HarmonyOS实战:3秒实现一个自定义轮播图
那么简单,需要考虑的细节很多。不过在 HarmonyOS 中实现一个轮播图却是十分的简单,本篇文章教你在最短的时间内快速实现一个自定义的 轮播图,建议点赞收藏!
HarmonyOS实战:快速实现一个上下滚动的广告控件
上要想实现这样的功能并不容易,那么在鸿蒙上怎么实现这样的功能呢?本篇文章教你使用最简单的方式实现一个支持上下滚动的广告控件,建议点赞收藏!
HarmonyOS实战:实现任意拖动的应用悬浮窗口
为了增加应用程序功能的丰富性和便利性,很多应用都会提供一个悬浮窗口实现多页面显示。特别是一些性能检测工具,比如 dokit 。在鸿蒙上怎么实现类似的全局悬浮窗口呢?阅读完本篇文章你将学会在鸿蒙上如何
【HarmonyOS 5】桌面快捷方式功能实现详解
【HarmonyOS 5】桌面快捷方式功能实现详解 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 在移动应用开发中,如何让用户快速
HarmonyOS实战:高德地图定位功能完整流程详解
前言 地图定位功能相信很多人都用过,在鸿蒙的应用程序开发中,使用高德地图的定位功能变得十分常见,那么在鸿蒙中一次完整的地位功能怎么实现?如果定位失败了,能否获取前几次的定位呢?本篇文章
HarmonyOS实战:组件化项目搭建
前言 鸿蒙应用开发已经成为互联网新的风口,开发鸿蒙软件已经成为今年工作的核心目标。在软件开发过程中,对于复杂度较大,功能较多的软件都会采用组件化项目架构,那么对于鸿蒙应用开发是否也能实现组件化呢
鸿蒙5开发宝藏案例分享---一多开发实例(股票类)
;{/*...*/})
}.width(\'70%\') // 固定宽度触发截断
}
? 开发经验:
当Tab超出容器时自动隐藏并显示\"...\"
用Blank组件实现间距自动填充
双指滑动
发表于 06-03 16:13
鸿蒙5开发宝藏案例分享---折叠屏悬停态开发实践
HarmonyOS早就准备好了超多实用案例,今天必须带大家解锁\"悬停态\"开发的正确姿势,手慢无哦~
?** 先来点干货:什么是悬停态?**
就是把折叠屏像笔记本电脑那样半折立在桌上
发表于 06-03 12:04
HarmonyOS实战:Tab顶部滑动悬停功能实现
评论