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

HarmonyOS ArkUI Scroll 组件完全指南

文章目录

    • 前言
    • 一、Scroll 基础用法
      • 1.1 最简单的 Scroll
      • 1.2 本项目中的 Scroll 使用
    • 二、Scroll 的核心属性
      • 2.1 滚动方向
      • 2.2 滚动条样式
      • 2.3 边缘效果
    • 三、用 Scroller 编程式控制滚动
      • 3.1 创建并绑定 Scroller
      • 3.2 常用 Scroller API
    • 四、水平滚动:TabBar 横向菜单
      • 4.1 实现分类横向滚动
    • 五、Scroll vs List:如何选择?
    • 总结

前言

当页面内容超出屏幕高度时,就需要滚动容器来承载。HarmonyOS ArkUI 提供了ScrollList两种主要的滚动组件。很多初学者傻傻分不清楚什么时候该用哪个。本篇聚焦Scroll组件的深入用法,并明确它与List的边界。

一、Scroll 基础用法

1.1 最简单的 Scroll

@Entry@Componentstruct BasicScrollDemo{privateitems:number[]=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];build(){// Scroll 只能有一个直接子节点Scroll(){Column({space:12}){// 模拟大量内容ForEach(this.items,(index:number)=>{Row(){Text(`${index+1}行内容`).fontSize(15).fontColor('#333333')}.width('100%').height(56).padding({left:16,right:16}).backgroundColor(index%2===0?'#FFFFFF':'#F8F9FA').borderRadius(8)})}.padding({left:16,right:16,top:8,bottom:8}).width('100%')}.width('100%').height('100%').scrollable(ScrollDirection.Vertical)// 垂直滚动(默认).scrollBar(BarState.Auto)// 自动显隐滚动条.edgeEffect(EdgeEffect.Fade)// 边缘回弹效果:渐隐}}

1.2 本项目中的 Scroll 使用

GasStationPage.etsbindBuilder()中用了 Scroll:

@BuilderbindBuilder(){Column(){Scroll(){if(this.stationInfoList&&this.stationInfoList.length>0){List(){ForEach(this.stationInfoList,(station:StationData)=>{ListItem(){Row({space:Constants.SPACE_12}){this.stationInfoCard(station);}.width(Constants.FULL_PERCENT);};},(station:StationData)=>station.id+station.name)}.width(Constants.FULL_PERCENT);}}.backgroundColor($r('app.color.start_window_background')).borderRadius(Constants.BORDER_RADIUS).margin({left:Constants.MARGIN_LEFT_16,right:Constants.MARGIN_RIGHT_16}).scrollable(ScrollDirection.Vertical).edgeEffect(EdgeEffect.Fade).scrollBar(BarState.Off)// 关闭滚动条.layoutWeight(Constants.ONE).height(Constants.MY_BUILDER_HEIGHT)}.height(Constants.MY_BUILDER_COLUMN_HEIGHT);}

提示:项目中用了Scroll嵌套List的结构,是因为bindSheet的高度是动态的,外层 Scroll 负责整体滚动控制,内层 List 负责数据项渲染。

二、Scroll 的核心属性

2.1 滚动方向

Scroll(){// ...内容}.scrollable(ScrollDirection.Vertical)// 垂直滚动(默认).scrollable(ScrollDirection.Horizontal)// 水平滚动.scrollable(ScrollDirection.Free)// 自由滚动(双向).scrollable(ScrollDirection.None)// 禁止滚动

2.2 滚动条样式

Scroll(){/* ... */}.scrollBar(BarState.Auto)// 滚动时显示,停止后隐藏.scrollBar(BarState.On)// 始终显示.scrollBar(BarState.Off)// 始终隐藏(项目中使用).scrollBarColor('#1A6FF5')// 滚动条颜色.scrollBarWidth(4)// 滚动条宽度

2.3 边缘效果

效果说明适用场景
EdgeEffect.Spring弹簧回弹iOS 风格体验
EdgeEffect.Fade边缘渐隐Android 风格,项目中使用
EdgeEffect.None无效果列表不需要回弹时

三、用 Scroller 编程式控制滚动

3.1 创建并绑定 Scroller

@Entry@Componentstruct ScrollControlDemo{// 创建 Scroller 控制器privatescroller:Scroller=newScroller();@StatescrollY:number=0;@StateshowBackTop:boolean=false;privateitems:number[]=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];build(){Stack(){Scroll(this.scroller){// 绑定控制器Column({space:12}){ForEach(this.items,(index:number)=>{Column({space:4}){Text(`加油站${index+1}`).fontSize(16).fontWeight(FontWeight.Medium)Text('北京市海淀区 · 距您 1.2km').fontSize(13).fontColor('#999999')}.width('100%').padding(16).backgroundColor('#FFFFFF').borderRadius(12).alignItems(HorizontalAlign.Start)})}.padding(16).width('100%')}.width('100%').height('100%').scrollBar(BarState.Off).onScroll((xOffset:number,yOffset:number)=>{// 监听滚动位置this.scrollY+=yOffset;this.showBackTop=this.scrollY>300;// 滚动超过300时显示回顶按钮})// 回到顶部按钮(浮层)if(this.showBackTop){Button('↑').width(44).height(44).borderRadius(22).backgroundColor('#1A6FF5').fontColor('#FFFFFF').fontSize(20).onClick(()=>{// 动画滚动到顶部this.scroller.scrollTo({xOffset:0,yOffset:0,animation:{duration:300,curve:Curve.EaseOut}});this.scrollY=0;}).position({right:16,bottom:80})}}.width('100%').height('100%')}}

3.2 常用 Scroller API

方法说明
scrollTo({ xOffset, yOffset })滚动到指定位置
scrollBy(dx, dy)相对滚动(当前位置基础上)
scrollEdge(Edge.Bottom)滚动到边缘(顶部/底部)
currentOffset()获取当前滚动偏移量
isAtEnd()是否已滚动到底部

四、水平滚动:TabBar 横向菜单

4.1 实现分类横向滚动

@Entry@Componentstruct HorizontalScrollDemo{@StateselectedIndex:number=0;privatecategories:string[]=['全部','中国石化','中国石油','壳牌','道达尔','BP石油','中海油','昆仑能源'];build(){Column({space:16}){// 横向滚动分类栏Scroll(){Row({space:8}){ForEach(this.categories,(cat:string,index:number)=>{Text(cat).fontSize(14).fontColor(this.selectedIndex===index?'#FFFFFF':'#666666').padding({left:16,right:16,top:8,bottom:8}).backgroundColor(this.selectedIndex===index?'#1A6FF5':'#F0F0F0').borderRadius(20).onClick(()=>{this.selectedIndex=index;})})}.padding({left:16,right:16})}.scrollable(ScrollDirection.Horizontal).scrollBar(BarState.Off).width('100%')// 内容区Text(`当前分类:${this.categories[this.selectedIndex]}`).fontSize(16).fontColor('#333333').padding(16)}.width('100%').padding({top:16})}}

五、Scroll vs List:如何选择?

需要滚动的内容类型? │ ├── 数量固定、内容多样(混合布局)────→ Scroll │ ├── 数量巨大(1000条以上)──────────→ List(虚拟化) │ ├── 需要分组标题、侧边索引栏 ────────→ List │ └── 数量有限(<100条)且布局一致 ──→ List 或 Scroll 均可
特性ScrollList
子节点任意一个(通常是 Column)只能是 ListItem
虚拟化❌ 全量渲染✅ 只渲染可见项
分组头❌ 需自己实现✅ ListItemGroup
大数据量⚠️ 慎用✅ 推荐

总结

Scroll是 ArkUI 中最通用的滚动容器,适合内容固定、布局混合的场景;通过Scroller控制器可以实现"回到顶部"、自动滚动等编程式控制。对于大量同类数据的渲染,推荐使用List(下一篇 List 深入讲解)。掌握scrollableedgeEffectscrollBar三个核心属性,加上onScroll事件监听,你就能应对绝大多数滚动场景。

http://www.jsqmd.com/news/963324/

相关文章:

  • 2026 盘点无锡黄金 Top 商家,同城变现实地核验真实报价 - 开心测评
  • Flowable任务监听器实战:如何动态分配审批人?以Create监听器为例
  • STM32串口DMA接收数据只收一次?别急着改循环模式,先检查这个中断处理细节
  • 三步实现八大网盘直链下载:告别限速烦恼的技术方案
  • 别再复制粘贴了!手把手教你从源码编译安装Google glog到Ubuntu 22.04
  • 2026佛山黄金回收榜单!保密交易、高价变现、到店可核验 - 奢侈品回收测评
  • 告别模拟输出烦恼:用STM32的I2C接口驱动MCP4725 DAC芯片,实现0-5V可调电压的保姆级教程
  • VMDE:5分钟掌握专业虚拟机检测技术,保护你的系统安全
  • Umi-OCR终极指南:5分钟掌握免费开源离线OCR文字识别工具
  • 2026年济南PMP报考材料怎么准备?PMI英文申请和冯老师入口 - 众智商学院职业教育
  • CSDN AI分发绑定机制逆向解析(基于V3.2.7 SDK源码):为什么“已登录≠已授权”?5行代码验证真实绑定状态
  • 高校课程设计可用的废品回收微信小程序源码(含云函数+完整页面)
  • 3步彻底解决Windows系统卡顿问题:AtlasOS开源优化方案详解
  • MCprep终极指南:让Minecraft Blender动画制作变得简单快速
  • 2026年 全自动在线式分板裁磨线推荐榜:分板裁磨线/自动分板裁磨线设备,高效裁切与精密磨边技术标杆 - 品牌企业推荐师(官方)
  • 2026年6月6日金价大跌 3.3%!上海黄金回收行情突变,出手旧金千万别被高价广告套路 - 速递信息
  • 实时AI人脸替换技术深度解析:Deep-Live-Cam移动端部署实战指南
  • 博弈论重构PCA:面向加密市场策略建模的特征降维新范式
  • 别再手动算NDVI了!用ENVI 5.3的Band Math,5分钟搞定Landsat-8植被指数提取
  • 终极宝可梦随机化工具教程:Universal Pokemon Randomizer ZX 完全指南
  • 上班族 AI 学习方案 第十一周AI 合规与数据安全
  • 新手友好:在快马平台上手第一个yolov5项目,零基础入门目标检测
  • 武汉品牌首饰回收分级评分榜(2026年6月实测):谁是你的S级选择? - 薛定谔的梨花猫
  • 别再折腾了!Windows 10/11下ArduPilot源码编译保姆级避坑指南(附GCC版本选择)
  • 出国探亲必办!亲属关系公证海牙认证线上办理全攻略与要点 - 速递信息
  • 【2026年6月深度实测】宁波本地防水堵漏企业名录|宁波卫生间屋顶防水维修商家 宁波靠谱防水补漏公司推荐,卫生间免砸砖/外墙/楼顶/地下室/阳光房渗漏修缮靠谱品牌盘点 - 防水空鼓维修家
  • 2026西安黄金回收价格解密 看懂大盘行情,卖黄金比别人多赚钱 - 奢侈品回收测评
  • CSDN AI不是黑箱:我们逆向分析了237篇高曝光/低曝光文章,提炼出4个决定是否被推送的核心指标
  • 2025 年 8 次飞行实测 5 款耳机:谁才是航空旅行与度假的最佳伴侣?
  • QQ音乐解密终极指南:3分钟学会用qmc-decoder解锁你的音乐收藏