HarmonyOS7 LongPressGesture 做编辑模式:长按只负责开门
文章目录前言为什么这个问题经常被写乱先把模式讲清楚先把页面目标想清楚完整 ArkTS 示例把关键代码一段段拆开交互细节新手最容易踩的坑放进真实项目还要补什么写在最后前言长按进入编辑模式很常见桌面图标、图片列表、频道管理都能用到。但这里最容易写乱的不是LongPressGesture而是进入编辑模式以后点击到底是打开还是选中再次长按要不要重复切换完成后选中状态要不要清空我的做法很简单长按只负责进入编辑模式后面的选择、取消、完成都交给明确状态。不要让一个手势同时承担入口、选择和提交。为什么这个问题经常被写乱LongPressGesture 做编辑模式 这类内容很容易被写成“代码能跑就算讲完了”但对初学者来说这恰恰是最不够的地方。真正让人卡住的往往不是某个组件名记不住而是不知道这段代码为什么要这样拆、状态为什么要这样放、以后需求变化时应该从哪里改。所以这篇文章不只想给你一个能跑的例子更想把背后的判断过程讲清楚。你只要把这个判断过程吃透后面自己改页面、补需求、查问题时心里会稳很多。先把模式讲清楚普通模式和编辑模式的点击行为完全不同代码里要先承认这件事。模式点击图标长按图标页面表现普通模式打开应用或详情进入编辑并选中当前项不显示角标编辑模式选中或取消选中保持编辑模式显示选择角标和完成按钮这样拆开后editing只表示页面模式selectedIds只表示已选中的数据互相不抢职责。先把页面目标想清楚在真正写代码之前先别急着盯着 API。更有用的做法是先想清楚这个页面到底想解决什么问题用户最在意的反馈是什么哪些状态必须一直保持一致。当你先把这条主线想明白再回头看组件和状态设计很多选择都会顺理成章。对小白来说这一步尤其重要因为它能帮你从“照着抄”慢慢过渡到“看得懂、改得动”。完整 ArkTS 示例interfaceDesktopAppItem{id:numbername:stringcolor:string}EntryComponentstruct LongPressEditPage{Stateediting:booleanfalseStateselectedIds:number[][]privateapps:DesktopAppItem[][{id:1,name:日程,color:#1E88E5},{id:2,name:笔记,color:#43A047},{id:3,name:文件,color:#FB8C00},{id:4,name:设置,color:#5E35B1}]privatetoggleSelect(id:number):void{if(this.selectedIds.includes(id)){this.selectedIdsthis.selectedIds.filter((item:number)item!id)return}this.selectedIdsthis.selectedIds.concat([id])}privateenterEditing(id:number):void{this.editingtrueif(!this.selectedIds.includes(id)){this.selectedIdsthis.selectedIds.concat([id])}}privatefinishEditing():void{this.editingfalsethis.selectedIds[]}build(){Column({space:14}){Row(){Text(this.editing?已选${this.selectedIds.length}个:我的桌面).fontSize(22).fontWeight(FontWeight.Bold)Blank()if(this.editing){Button(完成).height(34).onClick(()this.finishEditing())}}.width(100%)Grid(){ForEach(this.apps,(item:DesktopAppItem){GridItem(){Stack({alignContent:Alignment.TopEnd}){Column({space:8}){Text(item.name.substring(0,1)).fontSize(20).fontColor(Color.White).width(54).height(54).textAlign(TextAlign.Center).backgroundColor(item.color).borderRadius(14)Text(item.name).fontSize(13)}.justifyContent(FlexAlign.Center).width(100%).height(100%)if(this.editing){Text(this.selectedIds.includes(item.id)?✓:).width(22).height(22).fontSize(14).fontColor(Color.White).textAlign(TextAlign.Center).backgroundColor(this.selectedIds.includes(item.id)?#1E88E5:#DDDDDD).borderRadius(11)}}}.height(96).onClick((){if(this.editing){this.toggleSelect(item.id)}}).gesture(LongPressGesture().onAction(()this.enterEditing(item.id)))},(item:DesktopAppItem)item.id.toString())}.columnsTemplate(1fr 1fr 1fr 1fr).rowsGap(12).columnsGap(8)}.padding(16)}}把关键代码一段段拆开editing是模式开关。标题、完成按钮、选择角标都依赖它这样用户不会只凭一次长按反馈来猜当前状态。selectedIds只存 id不存整条对象。编辑模式常见后续动作是批量删除、批量移动、提交给接口用 id 会更轻也更不容易遇到对象引用变化的问题。enterEditing()负责长按入口并自动选中当前项。这符合用户直觉我长按了某个图标进入编辑后它应该已经被选中。普通模式下的点击示例里没有写跳转逻辑是为了突出编辑模式本身。真实项目里可以在!this.editing时执行打开详情或启动应用。交互细节完成按钮要清理selectedIds。如果只把editing改成false下次再进入编辑模式时可能保留旧选择用户会觉得页面状态串了。长按不要反复把模式开关取反。用户在编辑模式里再次长按某个图标通常不希望退出编辑而是继续保持当前模式。新手最容易踩的坑这一类示例最容易让人产生错觉界面出来了就以为已经掌握了。其实真正容易出问题的地方通常都在效果之外比如状态有没有收拢、失败后怎么兜底、以后要扩展时会不会牵一发动全身。所以你练这篇内容时别只看“现在能不能跑”还要继续看“以后好不好改”。能把这个习惯养起来你写出来的页面会比单纯照着示例拼出来的页面稳很多。放进真实项目还要补什么示例代码的重点是把核心思路讲明白所以很多工程化细节会故意省掉。真正落到项目里时你通常还要继续补接口联动、异常处理、边界保护、资源抽离以及和其他页面状态之间的配合。比较稳的做法是分三步走先把结构和职责立住再把真实业务接进去最后再优化视觉和交互体验。这样改出来的页面不只是“能演示”而是真的更接近可以长期维护的业务代码。写在最后LongPressGesture只是编辑模式的入口真正的体验来自模式状态和选择状态。把这两个状态拆开页面就不容易出现误触、残留选择和行为不一致。

相关新闻

ArcGIS Pro 从入门到实战基础篇(64):捕捉

ArcGIS Pro 从入门到实战基础篇(64):捕捉

编辑要素时,鼠标落点是否准确会直接影响几何质量,“捕捉”版块可以把光标吸附到符合条件的顶点、边或交点。 数据从哪来 工欲善其事,必先利其器,在学习 ArcGIS Pro 的各项功能之前,准备好合适的练习数据至关重要&…

2026/7/24 21:29:22 阅读更多 →
Diablo Edit2终极指南:如何5分钟内打造完美暗黑2角色,节省90%刷怪时间?

Diablo Edit2终极指南:如何5分钟内打造完美暗黑2角色,节省90%刷怪时间?

Diablo Edit2终极指南:如何5分钟内打造完美暗黑2角色,节省90%刷怪时间? 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中花费数小时…

2026/7/24 21:29:22 阅读更多 →
如何快速掌握微信好友自动化添加工具:实战配置与优化指南

如何快速掌握微信好友自动化添加工具:实战配置与优化指南

如何快速掌握微信好友自动化添加工具:实战配置与优化指南 【免费下载链接】auto_add_wechat_friends_py 微信添加好友 批量发送添加请求 脚本 python 项目地址: https://gitcode.com/gh_mirrors/au/auto_add_wechat_friends_py 微信好友自动化添加工具auto_a…

2026/7/24 21:29:22 阅读更多 →

最新新闻

鸿蒙Flutter json_serializable - 代码生成最佳实践

鸿蒙Flutter json_serializable - 代码生成最佳实践

引言 在Flutter开发中,手动编写序列化和反序列化代码不仅效率低下,还容易引入错误。json_serializable是一个强大的代码生成包,可以自动生成类型安全的序列化代码,大大提高开发效率和代码质量。 本章节将深入探讨json_serializabl…

2026/7/24 21:34:36 阅读更多 →
ChartFI:多模态大模型图表描述能力如何评估?(论文翻译与解读)

ChartFI:多模态大模型图表描述能力如何评估?(论文翻译与解读)

论文标题:ChartFI: Benchmarking Faithfulness and Insightfulness of Chart Descriptions from Multimodal Large Language Models 作者:Fen Wang, Zekai Shao, Qiman Kang, Chunran Hu, Zhixuan Zhang, Lexu Xie, Chao Liu, Siming Chen 项目地址&…

2026/7/24 21:34:36 阅读更多 →
实战鸿蒙Flutter 序列化与反序列化实战

实战鸿蒙Flutter 序列化与反序列化实战

引言 在Flutter应用开发中,数据序列化和反序列化是连接应用层与数据层的桥梁。无论是从网络获取数据、本地存储数据还是进行进程间通信,都需要将Dart对象与JSON字符串相互转换。 本章节将深入探讨序列化与反序列化的核心概念,结合天气查询应…

2026/7/24 21:34:36 阅读更多 →
为什么有的无人机巡检能真正“远程闭环”,有的还停留在人盯人?

为什么有的无人机巡检能真正“远程闭环”,有的还停留在人盯人?

很多项目嘴上说“自动化巡检”, 可一落地,现场还是离不开人。 表面上,无人机机场已经部署好了。 汇报材料里也写着“全自动巡检、无人值守、云端管理”。 但真正进入日常运行后,问题就来了。 团队还在反复确认设备是否在线、任务有…

2026/7/24 21:34:36 阅读更多 →
5分钟快速上手DeepL翻译插件:让浏览器变成你的多语言助手

5分钟快速上手DeepL翻译插件:让浏览器变成你的多语言助手

5分钟快速上手DeepL翻译插件:让浏览器变成你的多语言助手 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 还在为阅读外文网页而烦恼吗?Deep…

2026/7/24 21:34:36 阅读更多 →
社区志愿服务管理系统的设计与实现

社区志愿服务管理系统的设计与实现

摘 要 随着城市化进程的不断推进,社区志愿服务已成为提升基层治理水平的重要力量。针对传统社区志愿服务中存在的信息传递滞后、人工记录繁琐、时长统计不准确等问题,设计并开发了一套社区志愿服务管理系统。系统后端采用SSM框架,确保业务逻…

2026/7/24 21:33:23 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻