HarmonyOS7 手势识别:捏合、长按、拖拽,交互全靠它

鸿蒙NEXT开发:ArkTS组件-手势处理(LongPressGesture) 用于触发长按手势事件,触发长按手势的最少手指数为1,最短长按时间为500毫秒。 阅读详情

前言

A hand-drawn doodle illustration on pure white pap

你刷短视频双击点赞、看图捏合放大、长按弹出菜单——这些交互背后全是手势识别。HarmonyOS7 的手势系统比我想象的要完善,单手势、组合手势、优先级控制,该有的都有。但刚上手时确实容易晕:TapGesture 和 onClick 啥区别?PanGesture 方向怎么设?手势冲突怎么办?这篇把这些问题一次讲透。

手势体系概览

HarmonyOS7 提供的手势类型,一张表看全:

手势类型核心回调典型场景
TapGesture点击onAction双击点赞、多次点击
LongPressGesture长按onAction / onActionEnd长按菜单、拖拽预备
PanGesture拖拽/平移onActionStart/Update/End图片拖拽、滑动删除
PinchGesture捏合onActionStart/Update/End图片缩放
RotationGesture旋转onActionStart/Update/End图片旋转
SwipeGesture快速滑动onAction翻页、切歌

绑定方式有三种:

  • gesture():普通绑定,子组件优先
  • priorityGesture():优先绑定,父组件抢优先
  • parallelGesture():并行绑定,父子同时响应

划重点:大部分情况用 gesture() 就够了。只有父子组件手势冲突时才需要 priorityGesture 和 parallelGesture。

点击与长按

TapGesture——双击点赞

A hand-drawn doodle illustration on pure white pap

你可能问了:不是有 onClick 吗?区别在于 onClick 只能响应单击,TapGesture 能识别多次点击:

Image($r('app.media.heart'))
  .width(40)
  .height(40)
  .gesture(
    TapGesture({ count: 2 })
      .onAction(() => {
        this.toggleLike()
      })
  )

count: 2 表示双击触发。还有个细节——绑定 TapGesture({ count: 2 }) 后,单击不会触发任何回调。如果你需要单击和双击共存,得用组合手势(后面讲)。

LongPressGesture——长按弹出操作菜单

@State isLongPressed: boolean = false

Text('长按我试试')
  .fontSize(20)
  .gesture(
    LongPressGesture({ repeat: true })
      .onAction((event: GestureEvent) => {
        if (event.repeat) {
          // 持续长按中,可以震动反馈
        } else {
          this.isLongPressed = true
        }
      })
      .onActionEnd(() => {
        this.isLongPressed = false
      })
  )

A hand-drawn doodle illustration on pure white pap

参数 repeat: true 很关键——设了之后,长按过程中会持续触发 onAction,event.repeat 为 true 表示是重复触发。适合做"长按加速"效果,比如长按数字递增。

不设 repeat 的话,只在长按达到阈值时触发一次,手指抬起触发 onActionEnd。

拖拽——PanGesture 实战图片拖拽

这是最实用的手势之一,图片拖拽、列表滑动删除都用它:

@State imageX: number = 100
@State imageY: number = 100

Image($r('app.media.photo'))
  .width(80)
  .height(80)
  .position({ x: this.imageX, y: this.imageY })
  .gesture(
    PanGesture({ direction: PanDirection.All })
      .onActionStart(() => {
        console.info('开始拖拽')
      })
      .onActionUpdate((event: GestureEvent) => {
        this.imageX += event.offsetX
        this.imageY += event.offsetY
      })
      .onActionEnd(() => {
        console.info('拖拽结束')
      })
  )

关键讲解:

  • direction: PanDirection.All——允许所有方向拖拽。也可以设 PanDirection.Horizontal 或 PanDirection.Vertical 限制单方向
  • event.offsetX / offsetY——相对上一次回调的偏移量,不是绝对坐标。所以要用 += 累加
  • 如果要限制拖拽范围,在 onActionUpdate 里加边界判断就行

捏合缩放——PinchGesture 实战图片缩放

看大图时捏合缩放,几乎成了用户本能:

@State imageScale: number = 1
@State lastScale: number = 1

Image($r('app.media.photo'))
  .width(300)
  .height(200)
  .scale({ x: this.imageScale, y: this.imageScale })
  .gesture(
    PinchGesture()
      .onActionStart(() => {
        this.lastScale = this.imageScale
      })
      .onActionUpdate((event: GestureEvent) => {
        this.imageScale = this.lastScale * event.scale
        // 限制缩放范围
        if (this.imageScale < 0.5) this.imageScale = 0.5
        if (this.imageScale > 3) this.imageScale = 3
      })
      .onActionEnd(() => {
        this.lastScale = this.imageScale
      })
  )

为什么需要 lastScale?

event.scale 是相对手势开始时的缩放比例,不是相对上一次的。比如当前 scale 是 2,用户捏合让 event.scale 变成 1.5,那实际应该是 2 * 1.5 = 3,不是直接用 1.5。所以每次手势开始时记录当前 scale,update 时用 lastScale * event.scale 算真实值。

血泪教训:一定要限制缩放范围,不然用户一使劲缩到 0,图片就"没了";放大到 10 倍,直接卡死。

手势组合——并行与串行

单手势好理解,但实际需求经常要组合。比如"双击缩放 + 捏合缩放"、“长按后拖拽”。

并行组合——GestureGroup Parallel

双击缩放 + 捏合缩放同时生效:

.gesture(
  GestureGroup(GestureMode.Parallel,
    TapGesture({ count: 2 })
      .onAction(() => {
        animateTo({ duration: 200 }, () => {
          this.imageScale = this.imageScale > 1 ? 1 : 2
        })
      }),
    PinchGesture()
      .onActionUpdate((event: GestureEvent) => {
        this.imageScale = this.lastScale * event.scale
      })
  )
)

GestureMode.Parallel 表示两个手势互不干扰,各响各的。双击触发缩放切换,捏合触发连续缩放,两不误。

串行组合——GestureMode.Sequence

长按后拖拽——必须先长按触发,再拖拽才有效:

.gesture(
  GestureGroup(GestureMode.Sequence,
    LongPressGesture({ duration: 500 })
      .onAction(() => {
        // 长按触发,给出视觉反馈
        this.itemSelected = true
      }),
    PanGesture()
      .onActionUpdate((event: GestureEvent) => {
        this.itemX += event.offsetX
        this.itemY += event.offsetY
      })
  )
)

串行模式下,手势按顺序识别。长按成功后才识别拖拽,任何一个失败则整个组合失败。这就像 Android 的长按拖拽——得先按住不动,才能拖。

还有个 GestureMode.Exclusive(互斥),多个手势谁先识别算谁的,另一个取消。日常用得不多,知道就行。

写在最后

手势识别是交互体验的基础。搞懂了 Tap、LongPress、Pan、Pinch 四个手势,90% 的交互场景都能覆盖。组合手势稍微复杂点,但理解了并行和串行的区别就不难了。

实战建议:先从单手势开始做,调通了再组合。别上来就搞三四个手势并行,出了冲突调试到崩溃。手势和动画搭配使用效果翻倍——拖拽加个 animateTo 弹回,捏合加个平滑过渡,体验直接上一个档次。

HarmonyOS Next开发学习手册——组合手势 组合手势由多种单一手势组合而成,通过在GestureGroup中使用不同的GestureMode来声明该组合手势的类型,支持 顺序识别 、 并行识别 和 互斥识别 三种类型。mode:为GestureMode枚举类。用于声明该组合手势的类型。gesture:由多个手势组合而成的数组。用于声明组合成该组合手势的各个手势。 阅读详情

相关推荐

鸿蒙开发新手必备-如何快速实现手势使用场景

今天分享一下鸿蒙的手势,使用场景比较多,也是比较重要的一个功能点。

2401_82546228的博客 1763

HarmonyOS-ArkUI 手势系列2--单一手势(长按,拖拽,滑动,旋转,捏合)

本文深入解析了鸿蒙ArkUI中的手势交互机制,详细介绍了长按、拖拽、滑动、旋转和捏合五种单一手势的实现方式。通过gesture属性监听手势事件,开发者可配置参数并设置回调函数处理交互数据。文章提供了每种手势的完整代码示例,展示如何通过API实现缩放、旋转、位移等动态效果。手势分类包括单一、组合和多层级三种类型,本文重点剖析单一手势的API调用模式,为后续组合手势开发奠定基础。所有示例均采用接口类型化工厂常量模式,统一调用入口并隐藏实现细节。

童年纸飞机的博客 1152

HarmonyOS NEXT实战开发:组合手势

组合手势由多种单一手势组合而成,通过在GestureGroup中使用不同的GestureMode来声明该组合手势的类型...........

hanyanyou的博客 912

【入门到精通】鸿蒙next应用开发:ArkUI事件(单一手势)

应用程序的手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式。

m0_73088370的博客 1119

鸿蒙HarmonyOS (开发进阶)手势事件冲突解决方案

在复杂的应用界面中,多个组件嵌套时同时绑定手势事件,或者同一个组件同时绑定多个手势,都有可能导致手势事件产生冲突,达不到用户的预期效果。

WEZC156465的博客 1717

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:LongPressGesture)

ArkTS声明式开发-基础手势:LongPressGesture

m0_64420071的博客 2015

鸿蒙组件手势处理全解析:从基础操作到复杂交互实战

鸿蒙手势处理系统通过标准化接口与灵活组合机制,提供了从基础交互到复杂手势的完整解决方案。基础手势:点击 / 长按 / 平移 / 滑动 / 捏合的核心参数配置组合手势:顺序 / 并行 / 互斥模式的应用场景事件控制:优先级管理与冒泡机制的工程实现性能优化:轻量化处理与冲突解决方案建议从基础案例入手,逐步尝试复杂交互场景,结合官方模拟器的手势调试工具(如多点触控模拟)验证效果。随着鸿蒙生态的演进,手势处理将与 AI 交互、多设备协同深度融合,成为全场景应用的核心竞争力。

hqy1989的博客 1720

HarmonyOS 开发实践 —— 基于手势的图片预览与缩放

1、使用组合手势GestureGroup,同时绑定捏合手势PinchGesture和滑动手势PanGesture,设置组合手势识别模式为并行识别模式:Parallel,并行识别组合手势中注册的手势将同时进行识别,直到所有手势识别结束,并行识别手势组合中的手势进行识别时互不影响。2、在onTouch事件中识别手指滑动方向,并判断边界是翻页还是拖动,方向为左右且到达边界,执行scaleUnEnable方法,将panGesture手势方向置为none,执行翻页;反之执行滑动手势,不翻页。

liuhaojiabin的博客 1002

HarmonyOS6 PC端顺序手势组实战——长按后才能拖拽的秘密

顺序手势组是做"先选中再操作"交互的最佳方案。长按+拖拽这个组合在各种列表编辑、画板工具、图片标注场景里都用得到。关键是把步骤反馈做好,让用户随时知道自己在哪个阶段,别让人家猜。

qq_37048082的博客 690

DSP28335量产升级避坑指南:C2Prog串口烧录.hex文件,为什么我推荐COM1?

本文详细解析了DSP28335量产升级中C2Prog串口烧录.hex文件的最佳实践,重点推荐使用COM1端口以确保稳定性。通过实测数据和底层机制分析,揭示了Windows系统对COM1的特殊优化及C2Prog工具的时钟切换逻辑,帮助开发者规避常见陷阱,提升烧录成功率。

weixin_27066963的博客 380

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

【愚公系列】2023年12月 HarmonyOS教学课程 039-ArkUI事件(单一手势)

应用程序的手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式。手势操作可以包括点击、滑动、双击、捏合等动作,用于实现不同的功能和操作。

愚公智库 6万+

cosi-corr操作详细步骤

cosi-corr是一个可以加载到ENVI的软件包,由加利福尼亚理工学院的François Ayoub,  Sébastien Leprince,  and Lionel Keene开发,并且提供源代码,该软件受到了NSF的资助。软件的主要功能是可以满足各种影响的正射校正和影像配准。 针对下载下来的软件包参考《cosi-corr_guide.pdf》,进行配置使用具体详细过程如下: (本机环境

u013299471的专栏 1万+

鸿蒙中如何实现手势控制与交互?

在现代移动设备和智能硬件中,手势控制已经成为一种自然、直观且流畅的用户交互方式。随着触摸屏和传感器技术的不断发展,手势交互不仅限于简单的滑动和点击,它还可以扩展到复杂的用户操作,例如多指缩放、旋转、拖拽等。鸿蒙(HarmonyOS)作为一款创新的操作系统,提供了强大的手势控制与交互支持,帮助开发者为应用添加自然的、富有创意的用户交互体验。本文将详细介绍如何在鸿蒙中实现手势控制与交互,探讨手势识别的实现方式、如何通过手势实现不同的操作,以及手势交互的最佳实践与优化策略。

小白酷爱学编程,欢迎大家一块儿学习~~ 899

从零构建:openEuler WSL下的ARM交叉编译工具链自动化部署方案

本文详细介绍了在openEuler WSL环境下使用Ansible自动化部署ARM交叉编译工具链的方案。通过编写Ansible角色和Playbook,实现从基础环境配置到工具链安装、环境变量设置的一键部署,大幅提升嵌入式开发效率。方案支持多种ARM架构,并扩展了QEMU仿真、VS Code远程开发等实用功能,是嵌入式开发者的高效解决方案。

h3i4j的博客 377

Unity开发AR之Vuforia-MultiTarget笔记

在增强现实(AR)技术蓬勃发展的今天,越来越多的开发者开始探索如何将AR应用于各种场景中。Vuforia作为一个领先的AR开发平台,为开发者提供了强大的工具和功能,使得创建AR体验变得更加简单和直观。本文将为您介绍Vuforia的基本概念、特点,以及如何配置和使用MultiTarget功能,旨在帮助您更加深入地理解Vuforia SDK,并在您的项目中有效地应用。Vuforia是一个由PTC开发的增强现实SDK,它提供了丰富的功能,使团队能够在各种设备上创建互动的AR应用。

TxNet 1043

手势与动画结合:HarmonyOS6 PC打造极致交互体验

我一直觉得,判断一个桌面应用做的好不好,有个很简单的标准:随便点几个按钮、拖几个元素,如果感觉"跟手"、“舒服”,那交互设计就是到位的。这种"到位"的感觉,背后是手势系统和动画系统的精密配合。HarmonyOS6 PC 提供了一套相当完整的手势识别API,从最简单的点击到多指旋转都覆盖了。但光有手势识别还不够——用户做了手势,界面要给出即时的、符合直觉的动画反馈,才能形成闭环。今天这篇文章,我把每种手势和动画的配合方式都演示一遍,帮你做出真正"跟手"的交互体验。

qq_37048082的博客 2811

硬方案——几种实用的恒流源电路设计方案,敬请收藏(运放、三极管在手,让你玩出多种花样)

0 引言 我们在信号测量、供电等应用场景时常会涉及到使用恒流源,以前觉得恒流源挺神奇的,研究了下实现方案,其实也没有多么高深(这里讨论的仅限于用在信号测量中的小电流恒流源设计),这里给出几个实用的恒流源电路设计方案。 1 恒流源电路设计 (1)使用三极管搭建的恒流源 (2)使用运放搭建的恒流源 (3)使用恒流二极管搭建的恒流源 pt100恒流源测温电路图_电子技术_电工之家 ...

数字世界 万物互联 9511

鸿蒙5.0开发:ArkUI事件(单一手势)

手势操作可以包括点击、滑动、双击、捏合等动作,用于实现不同的功能和操作。

AyomQAQ的博客 1164

用Verilog搭建PCIe控制器核心模块

PCIe控制器是硬件设计的核心模块,负责实现设备与主机之间的高速通信。本文将以Verilog语言为例,分步骤讲解如何从零构建一个简化的PCIe控制器核心模块,涵盖事务层(TLP)生成、数据链路层(DLLP)处理和物理层(PHY)接口适配。目标是为嵌入式开发者、FPGA工程师提供一个可扩展的硬件设计框架。​。

xiaoheshang_123的博客 274

SDMA 如何实现设备对主机内存的访问

摘要:SDMA(System Direct Memory Access)是PCIe设备直接访问主机内存的核心机制,使外设无需CPU干预即可高效读写系统RAM。其实现原理包括:设备作为主控发起DMA请求,通过PCIe Memory TLP访问主机物理地址;完整通路涉及驱动分配DMA安全内存、设备配置、地址转换(IOMMU)和中断通知等步骤;关键技术涵盖地址类型(HPA/IOVA)、TLP格式、缓存一致性和安全防护机制。SDMA广泛应用于GPU、网卡、NVMe等高性能场景,是现代异构计算的基础技术,需软硬件协同

MHD0815的博客 234

鸿蒙-长按图片可拖拽listitem-手写版

/ 以下组合手势为顺序识别,当长按手势事件未正常触发时则不会触发拖动手势事件。

m0_51170428的博客 1993

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

手势光感融合智能体悬浮导航:HarmonyOS 6 多模态交互实战

摘要:HarmonyOS 6(API 23)将悬浮导航与沉浸光感推向了新高度。本文创新性地提出手势-光感多模态融合智能体架构,让悬浮导航不仅能"感知光线",更能"理解手势意图",实现手势操作与光感环境的双向驱动。文章涵盖完整的多模态状态机设计、手势识别引擎、光感融合决策算法及 ArkUI 渲染实战代码。本文介绍了手势光感融合智能体悬浮导航多模态输入融合:手势意图 + 6 维光感数据的双通道输入三 Agent 并行决策:布局 Agent、视觉 Agent、反馈 Agent 协同输出最优策略状态机驱动。

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Flutter for OpenHarmony 实战:手势检测(点击、双击、长按、拖拽)与交互反馈 --- 全面掌握手势识别,为控件添加丰富的交互反馈。

深入手势识别:熟练使用的各类回调(tap/doubleTap/longPress/pan)并理解 GestureArena 的竞态机制;交互反馈:通过颜色变化、SnackBar等方式为用户提供即时可感知的反馈;局部状态管理:将交互相关状态保存在组件内部 State 中,避免不必要的全局状态;性能优化:对高频交互(如拖拽)限定更新范围,使用Transform或减少布局与绘制开销;可访问性与可测试性:为关键交互提供语义标签并编写 Widget 测试模拟手势()验证行为。

2301_79166362的博客 655

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

鸿蒙交互事件开发06——组合手势

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。组合手势由多种单一手势组合而成,通过在GestureGroup中使用不同的GestureMode来声明该组合手势的类型,支持顺序识别、并行识别和互斥识别三种类型。mode:必选参数,为GestureMode枚举类。用于声明该组合手势的类型。取值有三个:Sequence、Parallel、Exclusive,分别表示:顺序识别、并行识别、互斥识别。

harmonyClassRoom的博客 1186

Flutter for OpenHarmony 实战:基于HarmonyOS API 24 手势检测(点击、双击、长按、拖拽)与交互反馈

本项目是一个专注于 Flutter 手势交互演示的教学型应用,通过单击、双击、长按、拖拽四种典型手势的集中展示,系统地呈现了 Flutter 手势检测系统的核心能力。全面掌握手势识别,为控件添加丰富的交互反馈。在移动开发领域,我们总是面临着选择与适配。今天,你的Flutter应用在Android和iOS上跑得正欢,明天可能就需要考虑一个新的平台:HarmonyOS(鸿蒙)。这不是一道选答题,而是很多团队正在面对的现实。Flutter的优势很明确——写一套代码,就能在两个主要平台上运行,开发体验流畅。

2301_79516858的博客 451
上一篇: HarmonyOS7 定位与地图:getLocation + Map 组件实现附近的人
下一篇: HarmonyOS7 瀑布流布局:WaterFlow 组件实现商品墙,比你想的简单
是稻香啊
博客等级 码龄10年 164粉丝 667原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值