HarmonyOS开发实战( Beta5版)Stack组件实现滚动吸顶效果实现案例

news2024/9/22 15:50:57

介绍

本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数,精准捕获滚动动作的发生。当滚动时,实时地调节组件的透明度、高度等属性,从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组件切换。其中,搜索框能够实现“吸顶”效果,在用户滚动页面时始终保持在顶部。

效果图预览

使用说明

  1. 加载完成后显示整个界面,超过一屏可以上下滑动可见嵌套滚动效果。
  2. 当滚动页面时,搜索框的位置会随着父级Scroll组件的滚动而变化。当父级Scroll组件滚动到底部时,搜索框恰好位于屏幕顶部。此时,父级Scroll组件停止滚动,子级Scroll组件开始滚动,实现嵌套滚动效果,从而实现搜索框的“吸顶”功能。

实现思路

  1. 在向上滑动过程中观察到头部组件(头像和二维码布局界面)是处于层级底部,而其他组件覆盖在其上方,为此,选择Stack组件来获取堆叠效果。搜索框的“吸顶”效果,通过监听onDidScroll事件来捕捉父级Scroll组件沿Y轴滚动的距离,并实时调整搜索框的高度。当用户滚动页面时,搜索框的位置会随着父级Scroll组件的滚动而变化。当父级Scroll组件滚动到底部时,搜索框恰好位于屏幕顶部,此时通过设置.nestedScroll属性(参考下面第4点)来控制父级与子级Scroll组件之间的嵌套滚动效果,进而实现搜索框的“吸顶”功能。
Stack({ alignContent: Alignment.Top }) {
  Flex({ justifyContent: FlexAlign.SpaceBetween }) { 
    // 头像和二维码页面布局代码
    // ...
  }
  Scroll(this.scroller) {
    // ...
  }
  .onDidScroll(() => {
    // 获取滑动距离
    const yOffset: number = this.scroller.currentOffset().yOffset;
    // this.searchHeight 随 yOffset变化的公式。按需调整。
    this.searchHeight = this.searchHeightRaw - yOffset * 0.6;
  })
}
  1. 在搜索栏下方的快捷功能区,向上滑动时,快捷功能区会逐渐隐藏,出现一个横向的新布局的快捷功能区,此处也通过使用Stack组件来获取堆叠效果。
Stack({ alignContent: Alignment.Top }) { 
  // 图标背景为白色快捷功能区
  IconView({
    isChange: this.isChange,
    marginSpace: this.marginSpace,
    opacity1: this.opacity1
  })

  // Scroll滚动子组件
  Scroll(this.scroller2) { 
    // 向上滑动透明的横向快捷区逐渐显示的布局代码
    // 上图下文字透明背景样式布局代码
    // 商品列表组件布局代码
    // ...
  }
}
  1. 实现滚动过程中动态调整文本框高度的功能时,运用Scroll组件滚动事件回调函数onDidScroll在滚动时修改文本框的高度及组件的透明度。
.onDidScroll(() => {
  // 通过Scroll的偏移量来动态修改透明度、尺寸和颜色等属性
  // ...
})
  1. 存在多层嵌套滚动的情况时,应该先滚动父组件,再滚动自身。只需要在内层的Scroll组件的属性nestedScroll设置向前向后两个方向上的嵌套滚动模式,实现与父组件的滚动联动。
Scroll(this.scroller2){
  // ...
}
.width('100%')
.scrollBar(BarState.Off)
.nestedScroll({
  scrollForward: NestedScrollMode.PARENT_FIRST, // 可滚动组件往末尾端滚动时的嵌套滚动选项,父组件先滚动,父组件滚动到边缘以后自身滚动。
  scrollBackward: NestedScrollMode.SELF_FIRST // 可滚动组件往起始端滚动时的嵌套滚动选项,自身先滚动,自身滚动到边缘以后父组件滚动。
})
  1. 在商品列表区域,采用瀑布流(WaterFlow)容器进行布局,将商品信息动态分布并分成两列呈现,每列商品自上而下排列。
WaterFlow() {
  LazyForEach(this.productData, (item: ProductDataModel) => {
    FlowItem() {
      // ...
  }, (item: ProductDataModel) => item.id.toString())
}
.nestedScroll({
  scrollForward: NestedScrollMode.PARENT_FIRST,
  scrollBackward: NestedScrollMode.SELF_FIRST
})
.columnsTemplate("1fr 1fr")
}
  1. 在商品列表(ProductList.ets)中,由于进入页面时只显示前两条数据,所以使用分帧加载的方式,在第一帧中将前两条数据放入到列表中,在第二帧中放入剩余数据。
aboutToAppear() {
    // 创建DisplaySync对象
    this.displaySync = displaySync.create();
    // 设置期望帧率
    const range: ExpectedFrameRateRange = {
      expected: 120,
      min: 60,
      max: 120
    };
    this.displaySync.setExpectedFrameRateRange(range);
    // 添加帧回调
    this.displaySync.on("frame", () => {
      // 第一帧中加载前两条数据
      if (this.frame === 1) {
        this.productData.pushData(PRODUCT_DATA.slice(0, 2))
        this.frame += 1;
      } else if (this.frame === 2) {
        // 第二帧中放入剩余数据
        this.productData.pushData(PRODUCT_DATA.slice(2, PRODUCT_DATA.length));
        this.frame += 1;
        this.displaySync?.stop();
      }
    });
    // 开启帧回调监听
    this.displaySync.start();
  }

高性能知识点

本示例使用了LazyForEach进行数据懒加载,WaterFlow布局时会根据可视区域按需创建FlowItem组件,并在FlowItem滑出可视区域外时销毁以降低内存占用。 本例中Scroll组件绑定onScroll滚动事件回调,onScroll属于频繁回调,在回调中需要尽量减少耗时和冗余操作,例如减少不必要的日志打印。 本例中使用DisplaySync分帧加载数据,减少动画首帧响应时间,降低加载数据的完成时延。

工程结构&模块类型

componentstack                                   // har类型
|---mock
|   |---IconMock.ets                             // 本地数据源 
|---model
|   |---DataSource.ets                           // 列表数据模型
|   |---IconModel.ets                            // 数据类型定义 
|---view
|   |---ComponentStack.ets                       // 滚动吸顶效果实现案例主页面 
|   |---IconView.ets                             // 按钮快捷入口自定义组件 
|   |---ProductList.ets                          // 商品列表自定义组件

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:

希望这一份鸿蒙学习文档能够给大家带来帮助~

GitCode - 全球开发者的开源社区,开源代码托管平台


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频教程+学习PDF文档

(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习文档(面试、文档、全套视频等)

                   

鸿蒙APP开发必备

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kubesphere缩短node notready后pod驱逐时长(pod-eviction-timeout无效)

本文在测试k8s高可用时会关闭某个node节点,然后看某些pod节点是否主动漂移到其他node节点,测试确实可以,但是时长为5分钟,这个时间长度项目上是不能接受的,比如尝试缩短这个时长,搜到更多的配置都是pod-evi…

Docker打包镜像

Docker打包镜像 前置工作 1.虚拟机中配置好docker环境,并导入nginx,mysql,jdk的镜像 2.下载docker for windows 用idea打包镜像和创建容器需要这个东西支持 下载安装包后执行,无脑回车即可 3.idea中配置docker连接 完成配置后&…

One-Shot Imitation Learning

发表时间:NIPS2017 论文链接:https://readpaper.com/pdf-annotate/note?pdfId4557560538297540609&noteId2424799047081637376 作者单位:Berkeley AI Research Lab, Work done while at OpenAI Yan Duan† , Marcin Andrychowicz ‡ ,…

上门家政系统小程序开发产品类目分析

在当今数字化时代,上门家政服务系统作为连接用户与家政服务供应商的重要桥梁,正逐步渗透到人们的日常生活中,为繁忙的现代人提供了极大的便利。作为一名程序员,我将从产品类目、技术实现及市场影响等角度,对上门家政系…

AI写的论文查重率高吗?分享6款实测AI论文生成免费网站

在当今学术研究和论文写作领域,AI技术的迅猛发展为研究人员提供了极大的便利。特别是AI论文自动生成助手,它们不仅能够提高写作效率,还能帮助生成高质量的论文内容。以下是六款经过实测且免费的AI论文生成网站推荐: 一、千笔-AIP…

linux离线安装nacos

1、打开 Nacos-GitHub ,点击 Release 可以看到 Nacos 的各版本跟新信息和安装包之类的 点击下载nacos-server-2.4.1.tar.gz,在linux创建nacos文件夹,把下载好的文件上传到nacos文件夹,并通过命令解压:tar -zxvf nacos-server-2.4.…

CUDA统一内存:简化GPU编程的内存管理

CUDA统一内存:简化GPU编程的内存管理 在现代GPU编程中,内存管理一直是开发者面临的一个重要挑战。特别是在使用NVIDIA CUDA进行高性能计算时,如何在CPU和GPU之间高效地传输数据、以及如何管理这些数据的生命周期,都是影响程序性能…

ABAP 调试宏DEFINE

文章目录 调试过程完整程序 调试过程 完整程序 REPORT Z_TEST_DEFINE.TYPES: BEGIN OF GTY_DATA,NAME TYPE STRING,AGE TYPE I,END OF GTY_DATA. DATA: GS_DATA TYPE GTY_DATA,GT_DATA TYPE TABLE OF GTY_DATA. DEFINE D_TEST.GS_DATA-NAME &1.GS_DATA-AGE &2.APPE…

Linux基础网络编程-Socket通信

本文使用C语言,在Centos实现Socket两种通信类型(TCP和UDP) 文章目录 一、安装gcc二、使用TCP协议,实现Socket(SOCKE_STREAM)流式通信1. 编写TCP_server.c函数和参数解释 2.编写TCP_client.c函数和参数解释 3. 编译并运行上述两个文件3.1 编译3.2 运行(启…

TVS汽车级 二极管SZESD9B5.0ST5G你了解多少?专为汽车电子系统设计的瞬态电压抑制二极管

SZESD9B5.0ST5G功能特性分析: SZESD9B5.0ST5G用于保护电压敏感型ESD组件。优异的关断能力,低泄漏,快速响应时间为以下设计提供一流的 ESD 保护。由于体积小,适合在手机、MP3播放器、数码相机和许多其他便携式设备板空间非常宝贵的…

2024高教社杯数学建模竞赛解题思路

高教社杯数学建模竞赛解题思路:独家出版,思路解析模型代码结果可视化。 A题思路及程序链接:https://mbd.pub/o/bread/ZpqblJZs B题思路及程序链接:https://mbd.pub/o/bread/ZpqblJZx D题思路及程序链接:https://mbd.pu…

制造业中工艺路线(工序)与产线(工作中心)关系

一.工艺路线与生产线是数字孪生中的虚实关系: 1.工艺路线为虚,生产线体为实; 2.工艺路线指导生产线的生产组织,生产线承载工艺路线的能力,把虚拟的生产信息流变成真实的产流。 二.工艺路线与生产线是数字孪生中互为“…

nginx中如何设置gzip

前言 Nginx通过配置gzip压缩可以提升网站整体速度 Nginx的gzip功能是用于压缩HTTP响应内容的功能。当启用gzip时,在发送给客户端之前,Nginx会将响应内容压缩以减小其大小。这样可以减少数据传输的带宽消耗和响应时间,提高网站的性能和速度。…

2024 数学建模高教社杯 国赛(C题)| 农作物的种植策略 | 建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,运用等多目标规划等强大工具,构建了这一题的详细解答哦! 为大家量身打造创新解决方案。小秘籍团队,始终引领着建模问题求解的风潮。 抓紧小秘籍,我们出发…

2024 年高教社杯全国大学生数学建模竞赛题目-A 题 “板凳龙” 闹元宵

“板凳龙”,又称“盘龙”,是浙闽地区的传统地方民俗文化活动。人们将少则几十条, 多则上百条的板凳首尾相连,形成蜿蜒曲折的板凳龙。盘龙时,龙头在前领头,龙身和龙尾 相随盘旋,整体呈圆盘状。一…

干货分享|分享一款免费开源的动态壁纸软件 Lively Wallpaper

1.软件特点: 1)这款软件拥有多种主题和风格的动态壁纸供你选择,包括自然风景、抽象艺术、动漫角色等。你可以根据个人喜好选择并自定义动态效果,如旋转、缩放、滚动等,让壁纸与你的电脑使用习惯相得益彰。 2&#xf…

【2024数模国赛赛题思路公开】国赛C题思路丨附可运行代码丨无偿自提

2024年国赛C题解题思路 C 题 农作物的种植策略 根据乡村的实际情况,充分利用有限的耕地资源,因地制宜,发展有机种植产业,对乡村经济的可持续发展具有重要的现实意义。选择适宜的农作物,优化种植策略,有利…

Word封面对齐技巧

文章目录 前言一、对齐封面1. 点击视图,添加标尺2. 选中文字,右击段落3. 点击制表符,设置制表位位置4. 鼠标点击“:”后面,点击“Tab”键5. 按住“Ctrl”键,选中没对齐的文字,点击“中文板式”,调整宽度6. 最终效果前言 本章使用的软件是WPS2019,简单介绍Word使用中封…

2024高教社杯全国大学生数学建模竞赛E题保姆级分析完整思路+代码+数据教学

2024高教社杯全国大学生数学建模竞赛E题保姆级分析完整思路代码数据教学 E题题目:交通流量管控 这道题目涉及一个拥有知名景区的小镇及其周边的道路交通管理问题。题目给出了一个现实中的交通场景,要求参赛者根据数据和交通模型,分析交通流量…

Axure制作圆球在区域范围内移动效果的案例

在Axure RP中,我们可以通过设置多个交互动作和动态面板来创建复杂的动画效果,比如实现一个圆球在指定区域内通过八个方向按钮控制移动的效果。以下是一个详细的步骤介绍,帮助你理解并制作这一效果。 预览: https://1zvcwx.axshare…