HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载,Scroll滚动到顶部

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载

效果展示

在这里插入图片描述
在这里插入图片描述

使用方法

import LoadingText from "../components/LoadingText"
import PageToRefresh from "../components/PageToRefresh"
import FooterBar from "../components/FooterBar"
class PageToRefreshController {onScrollTop = () => {}
}
@Entry
@Component
struct Index {//滚动回顶部方法startprivate PageToRefreshRef = new PageToRefreshController();onScrollTop(){this.PageToRefreshRef.onScrollTop()}//滚动回顶部方法endonSearch() {// 刷新数据this.loading = true;setTimeout(()=>{this.loading = false;this.simpleList = [1, 2, 3, 4, 5,6,7,8,9,10,11,12,13,14,15]},1000)}onReachBottom(){// 触底加载if(!this.finish){this.loading = true;setTimeout(()=>{this.loading = false;this.finish = true;this.simpleList = this.simpleList.concat([16,17,15,19,20,21,22,23,24,25,26,27,28,29,30])},1000)}}// 判断是否需要显示滚动到顶部的按钮(scroll滚动的位置)@State scrollY:number = 0;// 数据@State simpleList: Array<number> = [1, 2, 3, 4, 5,6,7,8,9,10,11,12,13,14,15];@State loading:boolean = false;@State finish:boolean = false;build() {Stack({ }) {Flex({ direction: FlexDirection.Column }) {// 顶部Column(){// 自定义顶部的组件Text('顶部标题').fontColor(0xffffff).fontSize(14)}.width('100%').padding(10).flexShrink(0).backgroundColor(0xFC5531).expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])// 内容Stack(){//调用组件PageToRefresh({controller: this.PageToRefreshRef, scrollY: this.scrollY, refreshPull: () => {this.onSearch()}, reachBottom: () =>{this.onReachBottom()}}){Column(){Row(){// 自定义内容Text('这里可以定义滚动后固定在顶部的内容').fontColor(0xffffff).fontSize(14)}.width('100%').height(50).backgroundColor(0x232020).justifyContent(FlexAlign.Center)List() {ForEach(this.simpleList, (item: number, index: number) => {ListItem(){Row(){Text(item.toString()).fontColor(0xffffff).fontSize(24)}.width('100%').height(80).backgroundColor(0x1BA035).margin({bottom: 10}).justifyContent(FlexAlign.Center)}}, (item: number) => item.toString())ListItem(){LoadingText({loading: this.loading, finish: this.finish, onPullData: () => {//点击直接加载数据this.onReachBottom()}})}}}.alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.Start).constraintSize({minHeight: '100%'})}if(this.scrollY >= 50){Row(){Text('我已经固定在顶部啦').fontColor(0xffffff).fontSize(14)}.position({x:0,y:0}).width('100%').height(50).backgroundColor(0x232020).justifyContent(FlexAlign.Center)}}.flexGrow(1).flexShrink(1)//你自定义的底部tabbar组件(仅供示例)FooterBar({scrollTop: this.scrollY >= 500, //判断是否显示滚动到顶部onGoTop: () => {//点击滚动到顶部的方法this.onScrollTop();}}).flexShrink(0)}.width('100%').height('100%')}}
}

新建PageToRefresh 组件

import LoadingText from "./LoadingText"
class PageToRefreshController {onScrollTop = () => {}
}
@Component
export default struct PageToRefresh {refreshPull?: () => voidreachBottom?: () => voidscroller: Scroller = new Scroller()private controller: PageToRefreshController = new PageToRefreshController();aboutToAppear() {if (this.controller) {this.controller.onScrollTop = this.onScrollTop;}}private onScrollTop = () => {//滚动回顶部this.scroller.scrollTo({ xOffset: 0, yOffset: 0, animation: { duration: 1000, curve: Curve.Ease } })}@Link scrollY: numberprivate currentOffsetY: number = 0;@State refreshStatus: boolean = false;@State refreshText: string = '正在刷新';@State pullUpText: string = '正在加载';@State isRefreshing: boolean = false;@State isCanLoadMore: boolean = false;@State ArrData: string[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];@State newArr: string [] = ['10', '11']putDownPullUpRefresh(event?: TouchEvent): void {if (event === undefined) {return;}switch (event.type) {case TouchType.Down:this.currentOffsetY = event.touches[0].y;break;case TouchType.Move:let isDownPull = event.touches[0].y - this.currentOffsetY > 50;if (isDownPull && this.isCanLoadMore === false && this.scrollY <= 20) {this.refreshStatus = true;}if(this.scroller.isAtEnd()){console.log('滚动到底部')this.isCanLoadMore = true;}break;case TouchType.Cancel:break;case TouchType.Up:if (this.refreshStatus) {console.log('下拉刷新')this.refreshStatus = false;if(this.refreshPull) this.refreshPull();}if (this.isCanLoadMore) {console.log('上拉加载')this.isCanLoadMore = false;if(this.reachBottom) this.reachBottom();}break;default:break;}}@BuilderputDown() {Row() {LoadingText({loading: true, finish: false, loadingText: this.refreshText})}.justifyContent(FlexAlign.Center).width('100%')}@BuilderPullUp() {Row() {LoadingText({loading: true, finish: false, loadingText: this.pullUpText})}.justifyContent(FlexAlign.Center).width('94%').height('5%')}@Builderslot() {Stack(){}.flexShrink(0)};@BuilderParam component: () => void = this.slot;build() {Column() {Scroll(this.scroller) {Column() {if (this.refreshStatus) {this.putDown()}this.component();}}.width('100%').onWillScroll(() => {this.scrollY = this.scroller.currentOffset().yOffset;}).onTouch((event?: TouchEvent) => {this.putDownPullUpRefresh(event);})}.width('100%').height('100%').backgroundColor(0xf4f4f4)}
}

加载文字

@Component
export default struct LoadingText {onPullData?: () => void@Prop loadingText: string = "加载中...";@Prop loading: boolean = false;@Prop finishText: string = "- 我是有底线的 -";@Prop finish: boolean = false;build() {Row() {if(this.loading){LoadingProgress().width(20).height(20).margin({ right: 10 }).color(0x999999)Text(this.loadingText).fontSize(12).fontColor(0x999999).margin({left: 4})}else if(this.finish){Text(this.finishText).fontSize(12).fontColor(0x999999)}else{Text("轻轻上拉加载更多").fontSize(12).fontColor(0x999999).onClick(()=>{if (this.onPullData) {this.onPullData()}})}}.alignItems(VerticalAlign.Center).justifyContent(FlexAlign.Center).width('100%').height(24)}
}

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

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

相关文章

Flink(八):DataStream API (五) Join

1. Window Join Window join 作用在两个流中有相同 key 且处于相同窗口的元素上。这些窗口可以通过 window assigner 定义&#xff0c;并且两个流中的元素都会被用于计算窗口的结果。两个流中的元素在组合之后&#xff0c;会被传递给用户定义的 JoinFunction 或 FlatJoinFunct…

Flink CDC 在阿里云实时计算Flink版的云上实践

摘要&#xff1a;本文整理自阿里云高级开发工程师&#xff0c;Apache Flink Committer 阮航老师在 Flink Forward Asia 2024 生产实践&#xff08;三&#xff09;专场中的分享&#xff0c;主要分为以下四个方面&#xff1a; Flink CDC & 实时计算 Flink CDC YAML 核心功能…

如何使用wireshark 解密TLS-SSL报文

目录 前言 原理 操作 前言 现在网站都是https 或者 很多站点都支持 http2。这些站点为了保证数据的安全都通过TLS/SSL 加密过&#xff0c;用wireshark 并不能很好的去解析报文&#xff0c;我们就需要用wireshark去解密这些报文。我主要讲解下mac 在 chrome 怎么配置的&…

【大模型系列篇】数字人音唇同步模型——腾讯开源MuseTalk

之前有一期我们体验了阿里开源的半身数字人项目EchoMimicV2&#xff0c;感兴趣的小伙伴可跳转至《AI半身数字人开箱体验——开源项目EchoMimicV2》&#xff0c;今天带大家来体验腾讯开源的数字人音唇同步模型MuseTalk。 MuseTalk 是一个实时高品质音频驱动的唇形同步模型&#…

C++基础入门(二)

目录 前言 一、重载 1.函数重载 2.运算符重载 二、构造函数 1.什么是构造函数 2.带参数的构造函数 3.使用初始化列表 4.this关键字 5.new关键字 三、析构函数 1.什么是析构函数 四、静态成员变量 1.静态成员的定义 2.静态成员变量的作用 五、继承 1.继承基本概…

基础vue3前端登陆注册界面以及主页面设计

1.下载依赖 "element-plus/icons": "^0.0.11", "element-plus/icons-vue": "^2.3.1", "fortawesome/fontawesome-svg-core": "^6.7.2", "fortawesome/free-solid-svg-icons": "^6.7.2", &quo…

Mybatis-Plus:乐观锁与悲观锁

文章目录 一、场景二、乐观锁与悲观锁三、模拟修改冲突3.1 数据库中增加商品表3.2 添加数据3.3 添加实体3.4 添加mapper3.5 测试 四、乐观锁实现流程4.1 Mybatis-Plus实现乐观锁 一、场景 一件商品&#xff0c;成本价是80元&#xff0c;售价是100元。老板先是通知小李&#xf…

卷积神经网络——食物分类

整体框架&#xff1a; 导入库 导入了各种必需的Python库&#xff0c;用于数据处理、图像读取、模型构建和训练。 设置随机种子 seed_everything: 用于设置所有随机数生成器的种子&#xff0c;确保每次运行时的结果都是相同的。 图像预处理&#xff08;transform&#xff09; 对…

Jmeter配置服务代理器 Proxy(二)

1.创建脚本记录器 2.配置&#xff1a;Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考&#xff1a;使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面&#xff0c;生成了证书&#xff1a; 5.给浏览器安装Jmeter代理的证书…

灰色预测and BP神经网络 (详细上手使用)

灰色预测模型 基础知识&#xff1a; 白色系统&#xff1a;系统的信息是完全明确的。 灰色系统&#xff1a;系统的部分信息已知&#xff0c;部分信息未知。 黑色系统&#xff1a;系统的内部信息是未知的。 灰色预测是对既含有已知信息又含有不确定信息的系统进行预则&#xf…

mac 安装 node

brew versions node // 安装 node brew versions node14 // 安装指定版本 卸载node: sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm su…

【Unity】unity3D 调用LoadSceneAsync 场景切换后比较暗 部门材质丢失

解决方法&#xff1a;两个场景使用同样灯光 现象 直接进入第二个场景是可以正常显示 调用LoadSceneAsync来切换后&#xff0c;第二个场景出现比较暗的情况 解决方法&#xff1a;两个场景使用同样灯光&#xff0c;在loading 的场景中加入灯光。 Light—Directional Light 如果…

红日-VulnStack靶场一

http://vulnstack.qiyuanxuetang.net/vuln/ 一、环境部署 win7(被攻击机/关火墙) web服务器 1张外网网卡(桥接192.168.1.105)&#xff0c;一张内网网卡192.168.52.143/255.255.255.0/192.168.52.2 DNS 192.168.52.138 winser2008 域控服务器 1张…

实现linux硬盘smart检测

一、下载交叉编译libatasmart库 下载链接&#xff1a;https://www.linuxfromscratch.org/blfs/view/svn/general/libatasmart.html libatasmart库编译依赖libudev库&#xff0c;交叉编译器前先准备依赖的libudev: 设置libudev的环境变量&#xff0c;并通过configure编译文件生…

蓝桥杯算法|基础笔记(1)

**时间复杂度** 一、概念理解 时间复杂度是用来衡量算法运行时间随输入规模增长而增长的量级。它主要关注的是当输入规模趋向于无穷大时&#xff0c;算法执行基本操作的次数的增长趋势&#xff0c;而不是精确的运行时间。 二、分析代码中的基本操作 确定关键操作 在一段代码…

Uniapp判断设备是安卓还是 iOS,并调用不同的方法

在 UniApp 中&#xff0c;可以通过 uni.getSystemInfoSync() 方法来获取设备信息&#xff0c;然后根据系统类型判断当前设备是安卓还是 iOS&#xff0c;并调用不同的方法。 示例代码 export default {onLoad() {this.checkPlatform();},methods: {checkPlatform() {// 获取系…

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…

Multi-Agent如何设计

文章小结 研究背景和目的 在单一大语言模型长期主导人工智能领域的背景下&#xff0c;多智能体系统在对话任务解决中逐渐崭露头角。 虽然先前的研究已经展示了多智能体系统在推理任务和创造性工作中的潜力&#xff0c;但对于其在对话范式方面的局限性以及单个智能体的影响&am…

Web端实时播放RTSP视频流(监控)

一、安装ffmpeg: 1、官网下载FFmpeg: Download FFmpeg 2、点击Windows图标,选第一个:Windows builds from gyan.dev 3、跳转到下载页面: 4、下载后放到合适的位置,不用安装,解压即可: 5、配置path 复制解压后的\bin路径,配置环境变量如图: <

keepalived双机热备(LVS+keepalived)实验笔记

目录 前提准备&#xff1a; keepalived1&#xff1a; keepalived2&#xff1a; web1&#xff1a; web2&#xff1a; keepalived介绍 功能特点 工作原理 应用场景 前提准备&#xff1a; 准备4台centos&#xff0c;其中两台为keepalived&#xff0c;两台为webkeepalive…