鸿蒙 ArkTS 实战:拖拽排序 DragSort
引言如果说示例 49「手势演示」展示了手势的基础用法那么示例 50「拖拽排序」就是手势在「列表交互」中的进阶应用。用户按住列表项上下拖动松开后列表项自动移动到目标位置。这个交互在移动端应用中非常常见——笔记排序、待办事项排序、播放列表排序等场景都需要拖拽排序功能。这个应用的实现核心是**PanGesture与列表数据的联动**拖动手势捕获手指位移。根据位移计算目标位置。使用数组splice方法重新排列列表项。整体替换数组触发ForEach刷新。1. 应用概述与功能「拖拽排序」页面自上而下分为顶部返回栏、可排序列表6 个水果项、底部提示文字。1.1 核心功能清单拖拽排序按住列表项上下拖动松开后自动排序。拖拽视觉反馈正在拖动的条目高亮蓝色背景 蓝色边框。位置计算根据手指位移和条目高度计算目标位置。数组重排使用splice方法将拖动项插入目标位置。Toast 反馈排序完成后提示新位置。1.2 技术要点一览PanGesture 三阶段onActionStart开始→onActionUpdate持续→onActionEnd结束。索引到位置的转换Math.round(dragOffset / itemHeight)将位移转换为目标索引。数组 splice 操作先删除原位置再插入目标位置。数组整体替换this.items arr触发State刷新。拖拽视觉状态dragIdx标记当前拖动项用于高亮显示。2. 核心知识点2.1 State 状态变量Stateitems:string[][苹果,香蕉,橙子,葡萄,西瓜,草莓];StatedragIdx:number-1;StatedragOffset:number0;items列表数据数组初始 6 个水果名。dragIdx当前正在拖动的条目索引-1表示无拖动。dragOffset当前拖动的 Y 轴偏移量vp。2.2 PanGesture 的三阶段.gesture(PanGesture().onActionStart((){this.dragIdxidx;this.dragOffset0;}).onActionUpdate((e:GestureEvent){this.dragOffsete.offsetY;}).onActionEnd((){this.handleDragEnd();}))onActionStart手指按下时触发记录拖动起始索引dragIdx和初始偏移0。onActionUpdate手指移动时持续触发更新偏移量dragOffset。onActionEnd手指松开时触发调用handleDragEnd()处理排序。2.3 handleDragEnd排序核心privatehandleDragEnd():void{if(this.dragIdx0){return;}constitemH:number56;constmove:numberMath.round(this.dragOffset/itemH);lettarget:numberthis.dragIdxmove;if(target0){target0;}if(targetthis.items.length-1){targetthis.items.length-1;}if(target!this.dragIdx){constarr:string[]this.items.slice();consttmp:stringarr[this.dragIdx];arr.splice(this.dragIdx,1);arr.splice(target,0,tmp);this.itemsarr;promptAction.showToast({message:已移动到第 (target1) 位});}this.dragIdx-1;this.dragOffset0;}排序流程有效性检查dragIdx 0时返回。计算目标位置move Math.round(dragOffset / itemH)将像素偏移转换为「移动了几格」。target dragIdx move计算目标索引。边界钳制target限制在[0, items.length - 1]范围内。数组重排arr.splice(dragIdx, 1)从原位置删除拖动项。arr.splice(target, 0, tmp)在目标位置插入。刷新状态this.items arr整体替换。重置拖动状态dragIdx -1、dragOffset 0。2.4 数组 splice 操作.splice(index, 1)删除指定位置的 1 个元素。.splice(index, 0, item)在指定位置插入元素不删除任何元素。两步操作实现了「移动」效果先删除再插入。2.5 视觉反馈.backgroundColor(this.dragIdxidx?#dbe7ff:Color.White).border({width:this.dragIdxidx?2:0,color:#1a6cff})正在拖动的条目dragIdx idx高亮显示浅蓝色背景 蓝色边框。2.6 列表项高度itemH: number 56与列表项的实际高度.height(52) padding大致对应。Math.round(dragOffset / itemH)将位移转换为移动的格数。3. 源码逐段解析3.1 数据初始化6 个水果苹果、香蕉、橙子、葡萄、西瓜、草莓。3.2 列表结构List({ space: 8 })ForEach渲染列表每个条目是 52vp 高的ListItem内部包含序号、名称、拖拽图标「≡」。3.3 拖拽图标每个条目右侧显示「≡」图标24fp浅灰色提示用户可以拖动排序。3.4 拖拽手势每个ListItem绑定PanGesture三阶段分别更新dragIdx/dragOffset或调用handleDragEnd()。3.5 视觉反馈拖动项通过dragIdx idx判断设置不同的背景色和边框。4. 关键实现细节分析4.1 拖拽 vs 排序的两阶段拖拽排序分为两个阶段拖动阶段onActionStart→onActionUpdate实时更新视觉状态。排序阶段onActionEnd一次性计算并执行排序。这种分离的好处是拖动过程流畅只更新视觉状态排序过程准确结束时一次性计算。4.2 位置计算的精度Math.round(dragOffset / itemH)使用四舍五入计算目标位置。这意味着只有当手指移动超过半格高度时才会改变目标位置。如果使用Math.floor则需要移动整整一格才会改变。4.3 数组整体替换this.items arr而不是直接操作原数组。这是 ArkTS 数组状态管理的标准做法——只有变量引用改变才能触发State刷新。4.4 边界处理拖拽到第一行以上或最后一行以下时target会被钳制在[0, length - 1]范围内。这防止了数组越界。4.5 重置拖动状态排序完成后或排序未发生时dragIdx和dragOffset都需要重置为初始值。这确保了下一次拖动的正确起始状态。5. 运行效果与操作指南5.1 运行步骤从入口页导航到「拖拽排序」页面。按住任意列表项如「香蕉」向上或向下拖动。松开手指列表项自动移动到新位置。查看 Toast 提示的新位置。6. 可扩展方向6.1 拖动态动画拖动过程中为目标位置添加插入动画如列表项平滑移动。6.2 多选排序支持多选后批量排序。6.3 持久化排序结果保存到本地下次打开时恢复。6.4 跨列表拖拽支持在两个列表之间拖拽排序。6.5 与手势演示结合添加长按进入「拖拽模式」松开退出的交互。7. 常见问题与调试技巧7.1 列表项不跟随手指当前实现中拖动过程中列表项不会跟随手指移动视觉上固定在原位。如果需要跟随效果需要设置translate属性.translate({ y: this.dragOffset })7.2 排序位置不准确检查itemH是否与实际条目高度匹配。如果条目有 padding 或 border需要相应调整。7.3 快速拖动跳回原位如果快速拖动后直接松手没有移动到新位置target可能等于dragIdx不会触发排序。这是正常行为。7.4 数组越界确认边界钳制逻辑target 0 → 0、target length - 1 → length - 1。8. 总结示例 50「拖拽排序」用约 106 行代码展示了 ArkTS 手势与列表交互的进阶应用。重点回顾PanGesture 三阶段onActionStart→onActionUpdate→onActionEnd。位置转换dragOffset / itemHeight将像素位移转换为索引位移。数组 splice先删除再插入实现移动。视觉反馈拖动项高亮显示。状态管理dragIdx/dragOffset分离拖动状态和数据状态。

相关新闻

ComfyUI从零安装到视频生成:双系统部署与节点工作流实战指南

ComfyUI从零安装到视频生成:双系统部署与节点工作流实战指南

最近在尝试用AI生成视频时,发现很多朋友被ComfyUI的安装和配置过程劝退。网上的教程要么版本过时,要么步骤零散,特别是对Mac和Windows双平台的支持以及插件、节点的部署,缺乏一套完整、可复现的解决方案。本文将为你带来一份从零开…

2026/10/14 17:18:29 阅读更多 →
电视RGB三原色思路延伸:原生三进制电磁波调制方案,打通光互联与6G无线通信底层逻辑

电视RGB三原色思路延伸:原生三进制电磁波调制方案,打通光互联与6G无线通信底层逻辑

文章声明本文为民间原创技术构想,仅作逻辑推演、学术与工程思路交流,不涉及任何涉密项目,保留完整署名权,开源协议遵循 CC BY-NC-SA 4.0。 系列前置文章:RGB-TOT光互联架构、CSMM复合光谱复用、CBDM面阵解调、BBM二进制…

2026/10/11 10:18:46 阅读更多 →
Unlock Music:如何免费快速解锁加密音乐文件的终极方案?

Unlock Music:如何免费快速解锁加密音乐文件的终极方案?

Unlock Music:如何免费快速解锁加密音乐文件的终极方案? 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项…

2026/10/15 11:35:36 阅读更多 →

最新新闻

openclaw-cn 接入 Google Antigravity:google-antigravity-auth 插件 OAuth 认证全指南

openclaw-cn 接入 Google Antigravity:google-antigravity-auth 插件 OAuth 认证全指南

人工智能AI Agent即时通讯后端本地部署语音 【免费下载链接】openclaw-cn 中文社区版OpenClaw,同原版保持定期更新,已内置钉钉、企业微信、飞书、QQ、微信以及国内网络环境优化。你的专属个人AI助手。支持所有操作系统和平台。🦞 项目地址&am…

2026/10/15 18:36:49 阅读更多 →
基于IoT23数据集的网络流量异常检测与分类实战指南

基于IoT23数据集的网络流量异常检测与分类实战指南

简介:这份资源面向网络安全与机器学习方向的学习者,提供基于IoT23数据集的网络流量异常检测与多分类完整实验方案。项目使用Python 3.8.8,结合scikit-learn、pandas、numpy、matplotlib、seaborn及psutil等工具,覆盖朴素贝叶斯、决…

2026/10/15 18:36:49 阅读更多 →
北京本地定制游旅行社有什么推荐判断法?给家庭游客的 6 个问题

北京本地定制游旅行社有什么推荐判断法?给家庭游客的 6 个问题

常有朋友临行前发来消息:"帮我推荐一家北京本地定制游旅行社吧。" 我们通常不会直接报名字,而是把六个问题发给他 —— 口碑能否核对、服务模式是否写清、行程能否调整、主体能否查证、讲解有没有深度、沟通跟不跟得上。我们在服务家庭游客时发…

2026/10/15 18:36:49 阅读更多 →
React Native跨平台进度条防溢出实战:从百分比计算到鸿蒙适配

React Native跨平台进度条防溢出实战:从百分比计算到鸿蒙适配

前两周我在做一个跑在 iOS、Android 和鸿蒙平台上的跨平台数据看板项目,里面有个存储空间使用率的模块,需求很单纯:一条条形图,填充宽度按value / max计算,旁边再显示当前值 / 最大值的文本标签,比如760 / …

2026/10/15 18:36:49 阅读更多 →
让 AI 造一台机器来解释概念:anatomy 四天拿下 3,719 星,TaoToken 统一 Key 接入 Claude Code 复现

让 AI 造一台机器来解释概念:anatomy 四天拿下 3,719 星,TaoToken 统一 Key 接入 Claude Code 复现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 18:36:49 阅读更多 →
RAG知识库中CSV/Excel解析的三大幻觉与四大暗礁

RAG知识库中CSV/Excel解析的三大幻觉与四大暗礁

1. 为什么表格和数据库是RAG知识库的“沉默瓶颈”——从CSV乱码到Excel公式失效的真实代价你有没有遇到过这样的场景:花三天时间搭好一个漂亮的RAG问答界面,用户输入“上季度华东区销售额Top5客户是谁”,系统却返回“未找到相关信息”。你反复…

2026/10/15 18:35:48 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →