在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

news2025/6/12 23:20:27

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,从单一手势特性、绑定方法原理到实战场景,为开发者构建完整的手势开发知识体系。

一、七大核心单一手势的深度解析

(一)基础交互:点击与长按手势

  1. 点击手势(TapGesture)
    • 通过count参数支持单 / 双击(如count: 2),fingers可定义多指触发(如三指点击)。
    • 案例:双击切换文本状态

typescript

@Component
export struct antion {
  @State isDouble: boolean = false

  build() {
    Column() {
      Text(this.isDouble ? '双击触发' : '单击触发')
        .gesture(
          TapGesture({ count: 2 })  //count: 点击次数
            .onAction(() => {
              this.isDouble = true
            }),
        )
    }
  }
}

  1. 长按手势(LongPressGesture)
    • repeat参数控制是否持续触发(如文件多选场景),duration可缩短至 300ms 提升灵敏度。
    • 案例:长按渐变背景色

typescript

@Component
export struct antion {
  @State color: string = '#000000';

  build() {
    Column() {
      Column()
        .width(100)
        .height(100)
        .backgroundColor(this.color)
        .gesture(
          LongPressGesture({ repeat: true })
            .onAction(() => this.color = `#${Math.random().toString(16).slice(2, 8)}`)
        )
    }
  }

(二)空间交互:拖动、捏合与旋转

  1. 拖动手势(PanGesture)
    • direction限定滑动方向(如Horizontal横向拖动),deltaX/deltaY实时获取偏移量。
    • 冲突处理:在List组件中使用时,通过distance: 10vp增大触发阈值避免误触。
    • 案例:可拖拽文本“张三”
@Component
export struct antion {
  @State name: string = '张三'
  @State offsetX: number = 0
  @State offsetY: number = 0

  build() {
    Column() {
      Text(this.name)
        .translate({ x: this.offsetX,  y: this.offsetY })
        .gesture(
          PanGesture()
            .onActionUpdate((event?: GestureEvent) => {
              if (event) {
                this.offsetX = event.offsetX
                this.offsetY = event.offsetY
              }
            })
        )
    }
  }
}

  1. 捏合手势(PinchGesture)
    • 基于双指间距变化计算scale值,适用于图片缩放(需结合Image组件的scaleMode)。
    • 案例:双指缩放图片

typescript

@Component
export struct antion {
  @State scale1: number = 1.0

  build() {
    Column() {
      Image($r('app.media.background'))
        .scale({ x: this.scale1, y: this.scale1 })
        .gesture(
          PinchGesture({fingers:2})   // fingers:number几只手指
            .onActionUpdate((event: GestureEvent) => {
              if (event.scale > 0 && event.scale < 2) {
                this.scale1 = event.scale
              }
            })
          // .onActionEnd(()=>{ })
        )
    }
  }
}

  1. 旋转手势(RotationGesture)
    • 通过deltaAngle获取实时旋转角度增量,配合rotate修饰符实现组件旋转。
    • 优化点:添加角度吸附(如Math.round(event.deltaAngle / 45) * 45)提升交互精度。
@Component
export struct antion {
  @State name: string = '张三'

  @State imgAngle: number = 0
  @State preangle: number = 0

  build() {
    Column() {
      Text(this.name)
        .fontSize(30)
        .rotate({ angle: this.imgAngle })
        .gesture(
          RotationGesture({fingers: 2})
            .onActionStart(() => {
              this.preangle = this.imgAngle
            })
            .onActionUpdate((event?: GestureEvent) => {
              if (event) {
                this.imgAngle = this.preangle + event.angle
              }
            })
        )
    }
  }
}

(三)快捷交互:滑动手势

SwipeGesture依赖滑动速度(默认 > 100vp/s)和方向识别,可组合多个方向(如Left | Right)。

  • 案例:滑动修改名字

typescript

@Component
export struct antion {

@State name:string ='张三'
  build() {
    Column() {
      Text(this.name)
        .gesture(
          SwipeGesture({ direction: SwipeDirection.Vertical})
            .onAction(() => {
              this.name = '李四'
            })
        )
        .width(100)
        .height(100)
        .backgroundColor(Color.Gray)
    }
  }

}

二、手势绑定策略:从竞争到协同的三级控制

(一)基础绑定:.gesture()的独立响应模式

  • 特性:子组件手势默认优先级高于父组件,适用于独立控件(如按钮、输入框)。
  • 多手势共存:同一组件可同时绑定点击和长按,通过事件类型区分响应。

typescript

@Component
export struct antion {

  @State name: string = '手势'
  build() {
    Column() {
      Text(this.name)
      Button('复合手势')
        .gesture(GestureGroup(GestureMode.Exclusive,
          TapGesture().onAction(() => {
            this.name = '点击'
          }),
          LongPressGesture().onAction(() => {
            this.name =  '长按'
          })
        )
        )
    }
  }
}

(二)优先级控制:.priorityGesture()的强制覆盖

  • 核心场景:父容器需要拦截子组件手势(如模态弹窗屏蔽底层操作)。
  • GestureMask 参数
    • IgnoreInternal:完全忽略子组件手势(如全局侧滑菜单)。
    • Normal:仅提升父组件优先级,允许子组件通过非竞争手势响应。
  • 案例:模态框拦截点击

typescript

@Component
export struct antion {
  @State name: string = '张三'

  @State showModal: boolean = true

  build() {
    Column() {
      Text(this.name)
        .fontSize(32)
      if (this.showModal) {
        Column()
          .width('100%')
          .height('100%')
          .backgroundColor('#80808066')
          .priorityGesture(
            TapGesture()
              .onAction(() => {
                this.showModal = false
              }),
            GestureMask.IgnoreInternal
          )
          .onAppear(() => {
            this.name  = '模态框拦截点击'
          })
      }
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .backgroundColor('#FFFFFF')
  }
}

三、手势开发核心挑战与解决方案

(一)手势冲突的三维处理模型

冲突类型

解决方案

典型场景

同组件多手势竞争

按事件类型顺序触发(如长按优先点击)

播放器控制按钮

父子组件同类型竞争

.priorityGesture()

.parallelGesture()

列表项滑动与父容器滚动

手势与系统交互冲突

event.stopPropagation()

阻止冒泡

自定义滑动冲突系统返回手势

(二)性能优化与用户体验平衡

  1. 参数调优矩阵

场景

distance

duration

speed

游戏操控

2vp

200ms

80vp/s

办公应用

5vp

500ms

120vp/s

老年人界面

10vp

800ms

50vp/s

  1. 视觉反馈设计
    • onActionStart时添加按压态(如缩放时轻微缩小)。
    • onActionUpdate实时显示操作结果(如拖拽时的半透明预览)。
    • onActionEnd通过动画平滑过渡(如旋转结束时的弹性效果)。


参考内容:华为手势官方文档

从基础的点击事件到复杂的多级手势联动,ArkTS 通过标准化的手势接口和灵活的绑定策略,为开发者提供了全场景交互的解决方案。在实际开发中,建议遵循 "先单一后组合、先独立后层级" 的原则,通过日志监控(console.log(event))和可视化调试工具(如 HarmonyOS DevEco Studio 的实时预览)逐步优化手势逻辑,最终实现精准响应与自然交互的平衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…