鸿蒙开发:单一手势实现长按事件

前言

本文基于Api13

上一篇文章,我们通过单一手势实现了单击和多次点击事件,在实际的开发中,除了点击事件之外,还有常见的长按事件,那么,在鸿蒙当中,如何去实现呢?在上篇文章中,关于点击事件我们列举了三种方式,其实关于长按事件也有多种方式实现,首先,关于长按事件,系统Api并没有一个通用的事件,需要自己来实现。

首先第一种方式,我们肯定能够想到使用onTouch方法,在手指按下的时候记录一个时间值,在手指抬起的时候再记录一个时间值,后者减去前者,如果大于我们定义的长按时间,那么就是一次长按事件,基本代码如下:

TypeScript 复制代码
Button("长按")
        .onTouch((event) => {
          if (event.type == TouchType.Down) {
            this.mDownTime = new Date().getTime()
          } else if (event.type == TouchType.Up) {
            let upTime = new Date().getTime()
            if ((upTime - this.mDownTime) > this.mLongClickTime) {
              //大于一秒就是长按
              console.log("===长按事件")
            }
          }
        })

以上的代码,虽然能够实现一个长按事件,但是是在每次手指抬起的时候才去触发,如果我不抬起呢?显然就不能触发,这明显是一个bug存在,所以,我们再去优化一下。

显然就不能在手指抬起的时候去执行一个长按事件,能不能在手指移动的时候呢?显然也是不可以的,毕竟如果手指不动呢,就无法触发移动,这里针对长按事件的实现,最终只能在手指按下,也就是down事件中。

在一个down事件中,如何大于长按的触发时间值呢?这里,我们可以采用延时setTimeout,按下的时候就直接启动延时,当大于所定义的长按时间后,就是一个长按事件,这里有一个注意事项,那就是如果未大于长按的时间,需要清除掉这个延时,否则,手指抬起了,等时间到了也会去执行。

TypeScript 复制代码
Button("长按")
        .onTouch((event) => {
          if (event.type == TouchType.Down) {
            this.mDownTime = new Date().getTime()
            this.mLongClickId = setTimeout(() => {
              console.log("===长按事件")
            }, this.mLongClickTime)
          } else if (event.type == TouchType.Up) {
            clearTimeout(this.mLongClickId)
          }
        })

日志输出

以上呢,是通过onTouch手势也实现了一个组件的长按事件,除此之外呢,我们也可以使用单一手势中的长按手势LongPressGesture来实现。

长按手势LongPressGesture

三个参数概述分别如下:

参数名称 参数类型 必填 参数描述
fingers number 触发长按的最少手指数,最小为1指, 最大取值为10指。默认值:1
repeat boolean 是否连续触发事件回调。默认值:false
duration number 触发长按的最短时间,单位为毫秒(ms)。默认值:500

简单案例如下:

TypeScript 复制代码
Button("长按")
        .gesture(LongPressGesture()
          .onAction((event: GestureEvent) => {
            if (event) {
              console.log("===长按事件")
            }
          })
        )

和单击一样,都是通过gesture来绑定手势,通过onAction来触发事件。

通过repeat参数,我们可以实现连续触发事件回调。

TypeScript 复制代码
Button("长按")
        .gesture(LongPressGesture({ repeat: true })
          .onAction((event: GestureEvent) => {
            if (event) {
              console.log("===长按事件")
            }
          })
        )

当然了,你也可以,通过duration来设置触发长按的最短时间,这里就不举例了。

相关总结

虽然说我们可以通过onTouch来实现一个长按事件,但是如果想要实现连续,多指那么就比较麻烦,远远没有LongPressGesture实现起来简单,所以在实际的开发中,大家还是以LongPressGesture为主。

相关推荐
HwJack205 小时前
HarmonyOS批量数据与性能优化实战:万条数据入库与不卡 UI 的查询
ui·性能优化·harmonyos
平头哥AI7 小时前
Day 22 _ 包装错误别丢链_%w、errors.Is 与 errors.As
android·服务器·学习·golang·go
聚美智数7 小时前
图片广告检测-图片审核-图片广告识别-图像广告检测
android
FrameNotWork8 小时前
HarmonyOS应用《左右相册》 隐私防窥实战:用 dlpAntiPeep 让相册“感知“正在被偷瞄
华为·harmonyos
早睡早起身体好12310 小时前
用 XGrammar 约束大模型工具调用:解决参数为空的问题
android·人工智能·神经网络·机器学习·自然语言处理·vllm
马剑威(威哥爱编程)11 小时前
HarmonyOS 应用上架审核避坑:驳回五类地图与提交前自检清单
华为·harmonyos
大佐不会说日语~12 小时前
Android 16 下 uni-app APP 提示“网络连接失败”的排障与修复
android·uni-app
2501_9151063213 小时前
苹果App Store上架费用及流程全面解析
android·ios·小程序·https·uni-app·iphone·webview
Privasa-隐私实验室14 小时前
蓝牙-多设备调试效率翻倍:从手动折腾到全自动调试的完整落地流程
物联网·ios·智能家居·智能硬件·智能手表
OH_TPC14 小时前
【鸿蒙优选三方库】@react-native-ohos/react-native-screens:原生屏幕导航管理
华为·harmonyos·鸿蒙