0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS实战:Tab顶部滑动悬停功能实现

尤枫 来源:jf_54996641 2025-06-24 17:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

日常开发过程中,遇到这种 Scroll 嵌套 List 列表滑动顶部悬停的场景十分常见,在鸿蒙开发时也正好实现了这个功能,本篇文章将带你一步步实现 Tab 顶部悬停的效果,建议点赞收藏!

实现效果

先看本文的最终实现效果如下:

需求分析

  • 当整体向上滑动时,优先 Scroll 向上滑动。
  • 当整体向下滑动时,优先 Scroll 向下滑动。

技术实现

  1. 首先需要实现基础页面布局,直接使用 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 布局。相信这对大多人来说没有什么难度。

  1. 搭建好基础布局后,开始处理滑动冲突问题。根据实现效果来看,每次都是让外层的 Scroll 优先滑动,需要给 List 增加拦截处理,让每次滑动优先外层 Scroll 布局滑动,这里使用nestedScroll 属性的NestedScrollMode.PARENT_FIRST,即优先父布局滑动。
.nestedScroll({
                      scrollForward: NestedScrollMode.PARENT_FIRST,
                      scrollBackward: NestedScrollMode.PARENT_FIRST
                    })
  1. 这时不管怎么上下滑动,里面的 List 都不会滑动,只让外层的 Scroll 组件滑动。接下来处理 List 的滑动事件。
  2. 首先定义一个枚举类型,用来标记滑动位置。
enum ScrollPosition {
  top,
  center,
  bottom
}
  1. 接下来分别实现 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}
                    })
  1. 再看外层 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 }
        })
  1. 根据 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直接连接主机,实现即插即用的输入体验。模块内置
    的头像 发表于 05-29 17:23 752次阅读
    新品 | <b class='flag-5'>Tab</b>5 Keyboard,<b class='flag-5'>Tab</b>5 键盘输入扩展模块

    AirCloud平台+excloud扩展库:核心功能实战应用!

    AirCloud平台的配置灵活性与excloud扩展库的功能扩展性,通过实战应用得以充分体现。下面整理核心功能实战示例集,覆盖常见业务需求场景:如通过平台配置快速搭建高可用架构,借助e
    的头像 发表于 12-24 17:17 825次阅读
    AirCloud平台+excloud扩展库:核心<b class='flag-5'>功能</b><b class='flag-5'>实战</b>应用!

    滑动开关详解:类型、规格和应用

    动作实现连接或断开。这篇简要的技术综述将研究滑动开关的工作原理,探讨其主要配置,并概述进行最优选择的电气和机械注意事项。 滑动开关的基础知识 [滑动开关]是一种机电元件,通过线性
    的头像 发表于 10-01 15:14 2621次阅读
    <b class='flag-5'>滑动</b>开关详解:类型、规格和应用

    基于LabVIEW的鼠标滑动方向检测教程

    本篇教程源于一位客户的真实需求,需要LabVIEW能够检测到鼠标滑动的方向,然后通过判断滑动方向处理后续的功能
    的头像 发表于 07-30 13:51 1109次阅读
    基于LabVIEW的鼠标<b class='flag-5'>滑动</b>方向检测教程

    HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

    HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言
    的头像 发表于 07-11 18:16 1695次阅读
    【<b class='flag-5'>HarmonyOS</b> 5】鸿蒙应用<b class='flag-5'>实现</b>发票扫描、文档扫描输出PDF图片或者表格的<b class='flag-5'>功能</b>

    HarmonyOS入门指南

    上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。 2、开源框架 harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,
    的头像 发表于 06-27 00:11 983次阅读

    HarmonyOS实战: 城市选择功能的快速实现

    最近在日常开发过程中,需要实现城市选择功能,同时支持模糊搜索。看似简单的功能动手实现起来却有很多难点。本篇文章详细记录开发过程中遇到的问题和对应的解决方法,希望能够帮助你,建议点赞收藏
    的头像 发表于 06-24 17:07 618次阅读

    HarmonyOS实战:3秒实现一个自定义轮播图

    那么简单,需要考虑的细节很多。不过在 HarmonyOS实现一个轮播图却是十分的简单,本篇文章教你在最短的时间内快速实现一个自定义的 轮播图,建议点赞收藏!
    的头像 发表于 06-24 17:06 1672次阅读

    HarmonyOS实战:快速实现一个上下滚动的广告控件

    上要想实现这样的功能并不容易,那么在鸿蒙上怎么实现这样的功能呢?本篇文章教你使用最简单的方式实现一个支持上下滚动的广告控件,建议点赞收藏!
    的头像 发表于 06-24 17:05 753次阅读

    HarmonyOS实战实现任意拖动的应用悬浮窗口

    为了增加应用程序功能的丰富性和便利性,很多应用都会提供一个悬浮窗口实现多页面显示。特别是一些性能检测工具,比如 dokit 。在鸿蒙上怎么实现类似的全局悬浮窗口呢?阅读完本篇文章你将学会在鸿蒙上如何
    的头像 发表于 06-24 17:04 1510次阅读

    HarmonyOS 5】桌面快捷方式功能实现详解

    HarmonyOS 5】桌面快捷方式功能实现详解 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 在移动应用开发中,如何让用户快速
    的头像 发表于 06-21 16:42 2556次阅读
    【<b class='flag-5'>HarmonyOS</b> 5】桌面快捷方式<b class='flag-5'>功能</b><b class='flag-5'>实现</b>详解

    HarmonyOS实战:高德地图定位功能完整流程详解

    前言 地图定位功能相信很多人都用过,在鸿蒙的应用程序开发中,使用高德地图的定位功能变得十分常见,那么在鸿蒙中一次完整的地位功能怎么实现?如果定位失败了,能否获取前几次的定位呢?本篇文章
    的头像 发表于 06-09 15:23 1399次阅读

    HarmonyOS实战:组件化项目搭建

    前言 鸿蒙应用开发已经成为互联网新的风口,开发鸿蒙软件已经成为今年工作的核心目标。在软件开发过程中,对于复杂度较大,功能较多的软件都会采用组件化项目架构,那么对于鸿蒙应用开发是否也能实现组件化呢
    的头像 发表于 06-09 14:58 865次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>实战</b>:组件化项目搭建

    鸿蒙5开发宝藏案例分享---一多开发实例(股票类)

    ;{/*...*/}) }.width(\'70%\') // 固定宽度触发截断 } ? 开发经验: 当Tab超出容器时自动隐藏并显示\"...\" 用Blank组件实现间距自动填充 双指滑动
    发表于 06-03 16:13

    鸿蒙5开发宝藏案例分享---折叠屏悬停态开发实践

    HarmonyOS早就准备好了超多实用案例,今天必须带大家解锁\"悬停态\"开发的正确姿势,手慢无哦~ ?** 先来点干货:什么是悬停态?** 就是把折叠屏像笔记本电脑那样半折立在桌上
    发表于 06-03 12:04