HarmonyOS7 LongPressGesture 做编辑模式:长按只负责开门

前言

长按进入编辑模式很常见,桌面图标、图片列表、频道管理都能用到。但这里最容易写乱的不是 LongPressGesture,而是进入编辑模式以后:点击到底是打开,还是选中?再次长按要不要重复切换?完成后选中状态要不要清空?

我的做法很简单:长按只负责进入编辑模式,后面的选择、取消、完成都交给明确状态。不要让一个手势同时承担入口、选择和提交。

为什么这个问题经常被写乱

一张适合技术文章的手绘笔记风框架图,主题是“HarmonyOS7 LongPressGesture

LongPressGesture 做编辑模式 这类内容很容易被写成“代码能跑就算讲完了”,但对初学者来说,这恰恰是最不够的地方。真正让人卡住的,往往不是某个组件名记不住,而是不知道这段代码为什么要这样拆、状态为什么要这样放、以后需求变化时应该从哪里改。

所以这篇文章不只想给你一个能跑的例子,更想把背后的判断过程讲清楚。你只要把这个判断过程吃透,后面自己改页面、补需求、查问题时,心里会稳很多。

先把模式讲清楚

普通模式和编辑模式的点击行为完全不同,代码里要先承认这件事。

模式点击图标长按图标页面表现
普通模式打开应用或详情进入编辑并选中当前项不显示角标
编辑模式选中或取消选中保持编辑模式显示选择角标和完成按钮

一张手绘笔记风对比图,主题是普通模式与编辑模式的点击行为差异。用左右两栏对比:左侧是普通模式,点击图

这样拆开后,editing 只表示页面模式,selectedIds 只表示已选中的数据,互相不抢职责。

先把页面目标想清楚

在真正写代码之前,先别急着盯着 API。更有用的做法是先想清楚:这个页面到底想解决什么问题,用户最在意的反馈是什么,哪些状态必须一直保持一致。

一张手绘笔记风流程图,主题是 HarmonyOS7 桌面图标长按进入编辑模式后的交互流程。流程从“长

当你先把这条主线想明白,再回头看组件和状态设计,很多选择都会顺理成章。对小白来说,这一步尤其重要,因为它能帮你从“照着抄”慢慢过渡到“看得懂、改得动”。

完整 ArkTS 示例

interface DesktopAppItem {
  id: number
  name: string
  color: string
}

@Entry
@Component
struct LongPressEditPage {
  @State editing: boolean = false
  @State selectedIds: number[] = []

  private apps: DesktopAppItem[] = [
    { id: 1, name: '日程', color: '#1E88E5' },
    { id: 2, name: '笔记', color: '#43A047' },
    { id: 3, name: '文件', color: '#FB8C00' },
    { id: 4, name: '设置', color: '#5E35B1' }
  ]

  private toggleSelect(id: number): void {
    if (this.selectedIds.includes(id)) {
      this.selectedIds = this.selectedIds.filter((item: number) => item !== id)
      return
    }
    this.selectedIds = this.selectedIds.concat([id])
  }

  private enterEditing(id: number): void {
    this.editing = true
    if (!this.selectedIds.includes(id)) {
      this.selectedIds = this.selectedIds.concat([id])
    }
  }

  private finishEditing(): void {
    this.editing = false
    this.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 只是编辑模式的入口,真正的体验来自模式状态和选择状态。把这两个状态拆开,页面就不容易出现误触、残留选择和行为不一致。

内容概要:本文研究了基于阶跃响应的V-Tiger自动增益调整PID控制器优化方法,并提供了完整的Matlab代码实现。通过深入分析PID控制的核心性能指标与V-Tiger控制器的动态特性,提出了一种融合阶跃响应特征提取与多目标协同优化的自动整定方案,设计了具备自适应迭代校正能力的优化机制,有效提升了控制系统的响应速度、稳定性和抗干扰能力。文中系统阐述了整定原理、算法架构设计及性能验证流程,通过仿真实验充分验证了该方法在复杂工业控制场景下实现高精度参数自整定的可行性与优越性,为智能PID控制提供了可复现、可拓展的技术路径。; 适合人群:具备自动控制理论基础和Matlab编程能力,从事控制工程、自动化、电气工程等领域研究的研发人员及高校研究生。; 使用场景及目标:①应用于需要高精度PID参数整定的工业控制系统中,如电机驱动、温度控制、电力电子变换器等;②为科研人员提供一种可复现、可扩展的智能PID整定方法,用于提升系统动态性能与鲁棒性;③作为教学案例帮助学生理解PID整定原理与现代优化算法的融合应用。; 阅读建议:建议读者结合文中的Matlab代码逐模块运行与调试,重点关注阶跃响应特征提取与增益优化策略的实现逻辑,同时可尝试将其应用于实际控制系统中进行对比验证,以深化对自动整定机制的理解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值