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

HarmonyOS6 ArkTS ListItem设置划出组件

文章目录

    • 一、功能说明
    • 二、完整标准代码
    • 三、核心 API:swipeAction 配置详解
      • 1. 基础结构
      • 2. end 右侧划出配置项
    • 四、关键用法逐行解析
      • 1. 定义划出组件 UI(@Builder 复用)
      • 2. 绑定划出组件到 ListItem
      • 3. 滑动删除动画
      • 4. 控制滑动行为(ListScroller)
      • 5. 滑动状态监听
    • 五、运行效果
    • 总结

一、功能说明

ListItem 的swipeAction属性用于配置侧滑划出组件,是列表类应用的核心交互能力:

  • 支持右侧滑出(end)/左侧滑出(start)自定义操作按钮
  • 支持滑出按钮点击事件、滑动区域进入/退出监听
  • 支持控制滑动距离、自动关闭滑动等行为
  • 常用于列表项删除、编辑、标记、置顶等操作场景

二、完整标准代码

// xxx.ets @Entry @Component struct ListItemExample2 { @State arr: number[] = [0, 1, 2, 3, 4]; @State enterEndDeleteAreaString: string = 'not enterEndDeleteArea'; @State exitEndDeleteAreaString: string = 'not exitEndDeleteArea'; private scroller: ListScroller = new ListScroller(); @Builder itemEnd() { Row() { Button('Delete').margin('4vp') Button('Set').margin('4vp').onClick(() => { this.scroller.closeAllSwipeActions(); }) }.padding('4vp').justifyContent(FlexAlign.SpaceEvenly) } build() { Column() { List({ space: 10, scroller: this.scroller }) { ForEach(this.arr, (item: number) => { ListItem() { Text('item' + item) .width('100%') .height(100) .fontSize(16) .textAlign(TextAlign.Center) .borderRadius(10) .backgroundColor(0xFFFFFF) } .transition(TransitionEffect.OPACITY) .swipeAction({ end: { builder: () => { this.itemEnd() }, onAction: () => { this.getUIContext()?.animateTo({ duration: 1000 }, () => { let index = this.arr.indexOf(item); this.arr.splice(index, 1); }); }, actionAreaDistance: 56, onEnterActionArea: () => { this.enterEndDeleteAreaString = 'enterEndDeleteArea'; this.exitEndDeleteAreaString = 'not exitEndDeleteArea'; }, onExitActionArea: () => { this.enterEndDeleteAreaString = 'not enterEndDeleteArea'; this.exitEndDeleteAreaString = 'exitEndDeleteArea'; } } }) }, (item: number) => item.toString()) } Text(this.enterEndDeleteAreaString).fontSize(20) Text(this.exitEndDeleteAreaString).fontSize(20) } .padding(10) .backgroundColor(0xDCDCDC) .width('100%') .height('100%') } }

运行效果如图:
默认情况:

当把最后一个往左滑:

当左滑超过一半 本条item会消失,或者点击delete也会消失:


三、核心 API:swipeAction 配置详解

swipeAction是 ListItem 提供的划出组件专属属性,用于定义左右侧滑显示的操作栏,是官方标准API。

1. 基础结构

.swipeAction({ start?: {}, // 左侧滑出组件(可选) end?: {} // 右侧滑出组件(本文示例使用) })

2. end 右侧划出配置项

参数名类型说明
builderCustomBuilder必填,划出组件的UI构造器
onAction() => void滑动触发动作(滑动到阈值后执行)
actionAreaDistancenumber滑动阈值,单位vp
onEnterActionArea() => void手指滑动进入有效操作区域时触发
onExitActionArea() => void手指滑动退出有效操作区域时触发

四、关键用法逐行解析

1. 定义划出组件 UI(@Builder 复用)

使用@Builder装饰器定义可复用的侧滑按钮布局,是官方推荐写法:

@Builder itemEnd() { Row() { Button('Delete').margin('4vp') Button('Set').margin('4vp').onClick(() => { // 关闭所有ListItem的滑动展开 this.scroller.closeAllSwipeActions(); }) }.padding('4vp').justifyContent(FlexAlign.SpaceEvenly) }

2. 绑定划出组件到 ListItem

直接在 ListItem 后链式调用.swipeAction()

ListItem() { ... } .swipeAction({ end: { builder: () => { this.itemEnd() }, // 绑定侧滑布局 onAction: () => { ... }, // 滑动删除逻辑 actionAreaDistance: 56, // 触发阈值 56vp onEnterActionArea: () => { ... }, // 进入滑动区域 onExitActionArea: () => { ... } // 退出滑动区域 } })

3. 滑动删除动画

使用animateTo实现平滑删除动画,提升交互体验:

this.getUIContext()?.animateTo({ duration: 1000 }, () => { let index = this.arr.indexOf(item); this.arr.splice(index, 1); });

4. 控制滑动行为(ListScroller)

closeAllSwipeActions()可一键关闭所有展开的滑动项:

this.scroller.closeAllSwipeActions();

5. 滑动状态监听

实时监听用户是否进入滑动有效区域,可用于提示、音效、震动等交互增强:

onEnterActionArea: () => { this.enterEndDeleteAreaString = 'enterEndDeleteArea'; } onExitActionArea: () => { this.exitEndDeleteAreaString = 'exitEndDeleteArea'; }

五、运行效果

  1. 页面显示 5 个白色圆角列表项,灰色背景
  2. 对任意列表项右滑,显示 Delete / Set 按钮
  3. 滑动超过 56vp 触发自动展开操作栏
  4. 完全滑动触发删除动画,列表项平滑消失
  5. 点击 Set 按钮,关闭所有展开的滑动项
  6. 页面顶部实时显示:enterEndDeleteArea/exitEndDeleteArea

总结

ListItem 的swipeAction是 HarmonyOS 官方提供的侧滑划出组件标准方案,核心能力包括:

  1. 支持左右侧滑自定义按钮布局
  2. 提供完整的滑动生命周期监听
  3. 支持滑动阈值、触发动作、滑动关闭控制
  4. 配合动画可实现流畅的删除/编辑交互

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是持续创作的动力!
如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是持续创作的动力!

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

相关文章:

  • 嵌入式NTP客户端库:高精度时间同步与自动时区管理
  • 自学嵌入式第一天
  • 多行业适配螺杆泵及泵送系统供应商:进口螺杆泵配件、锂电池专用螺杆泵、食品级螺杆泵、高压螺杆泵、不锈钢螺杆泵、加药螺杆泵选择指南 - 优质品牌商家
  • WooCommerce 高级报告与统计 – 订单、产品与客户报告 WordPress插件SQL注入[ CVE-2026-24993 ]
  • 3D Slicer新手必看:如何用窗宽窗位优化CT图像显示效果(附VTK对比)
  • 4个关键步骤:用vscode-ai-toolkit实现智能应用开发全流程
  • MC备份1
  • Sentaurus实战解析:SiC NMOS仿真中的关键参数设置与优化
  • 2026年比较好的呼市原车漆补漆实力车行推荐 - 品牌宣传支持者
  • Tomato-Novel-Downloader:你的终极番茄小说离线阅读解决方案
  • 管道巡检软体机器人 YOLOv8 模型部署全流程(PT→ONNX→昇腾OM)
  • 从对话到执行:一文读懂AI Coding Agent的底层原理
  • 质量块-阻尼器-弹簧系统H的鲁棒控制:次最优、Loopshaping与μ综合dk迭代设计案例
  • 数据增广翻车现场实录:我的模型准确率为什么反而下降了?附PyTorch调试避坑指南
  • 3大突破策略:Bypass Paywalls Clean 2024全场景应用指南
  • APK Studio核心功能解析:深入理解反编译与重编译流程
  • 2026电力盖板及玻璃钢制品优选营顺高性价比服务:玻璃钢电缆沟盖板/玻璃钢罐体/玻璃钢运输罐/电缆沟盖板/酸碱罐/选择指南 - 优质品牌商家
  • PyTorch模型部署实战:FP16 vs FP32 vs TF32 vs INT8性能对比与选择指南
  • 从6颗MLCC到高通滤波器:解码耳机输出耦合电容的取舍艺术
  • 从Dhrystone到SPEC:聊聊那些年我们跑过的“分”,以及为什么现在不能全信它
  • 轻量级MCU菜单框架设计与实现
  • 2026年知名的补漆/呼市汽车补漆热门推荐榜 - 品牌宣传支持者
  • Python异步编程新选择:用Channels替代Celery实现实时消息推送(Django 3.2+演示)
  • ANSYS_APDL——实例002-结构静力学分析
  • Systolic阵列优化技巧:如何减少硬件资源消耗并提升矩阵乘法效率
  • OpenRouter报错403
  • 单片机驱动分离架构设计与实践指南
  • 大模型---量化
  • nginx做四层代理配置
  • 【技术解析】PSMNet:如何通过金字塔池化与堆叠沙漏3D CNN革新立体匹配?