当前位置: 首页 > news >正文

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

介绍

本示例介绍运用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开发必备

​​

总结

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 前端登录鉴权——以若依Ruoyi前后端分离项目为例解读
  • 单点登录SSO
  • 大模型推理框架 RTP-LLM 架构解析
  • 《LeetCode 热题 100》
  • 人机环境系统智能与Petri网
  • kubeadm方式升级k8s集群
  • SprinBoot+Vue校园活动报名微信小程序的设计与实现
  • Android的Launch
  • 读懂以太坊源码(3)-详细解析genesis.json
  • 深度学习5从0到1理解RNN(包括LTSM,GRU等):内容丰富(上)
  • Linux-目录结构和Vim编辑器
  • elementUI根据列表id进行列合并@莫成尘
  • 无线通信-WIFI通信
  • [数据集][目标检测]汽油检泄漏检测数据集VOC+YOLO格式237张2类别
  • opencv --- 人脸识别、人脸比对
  • 《剑指offer》分解让复杂问题更简单
  • Android组件 - 收藏集 - 掘金
  • Angular 4.x 动态创建组件
  • C++类中的特殊成员函数
  • CSS居中完全指南——构建CSS居中决策树
  • JAVA_NIO系列——Channel和Buffer详解
  • java8-模拟hadoop
  • PaddlePaddle-GitHub的正确打开姿势
  • Shell编程
  • 回流、重绘及其优化
  • 聊聊sentinel的DegradeSlot
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 手机端车牌号码键盘的vue组件
  • 用element的upload组件实现多图片上传和压缩
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #AngularJS#$sce.trustAsResourceUrl
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $.ajax,axios,fetch三种ajax请求的区别
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)STL算法之遍历容器
  • (javascript)再说document.body.scrollTop的使用问题
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (超详细)语音信号处理之特征提取
  • (二)JAVA使用POI操作excel
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (回溯) LeetCode 77. 组合
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (七)Knockout 创建自定义绑定
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)SvelteKit教程:layout 文件
  • (学习日记)2024.01.09
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • **CI中自动类加载的用法总结
  • .equals()到底是什么意思?