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

前言

本文基于Api13

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

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

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,按下的时候就直接启动延时,当大于所定义的长按时间后,就是一个长按事件,这里有一个注意事项,那就是如果未大于长按的时间,需要清除掉这个延时,否则,手指抬起了,等时间到了也会去执行。

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) } })

日志输出

image

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

长按手势LongPressGesture

image

三个参数概述分别如下:

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

简单案例如下:

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

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

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

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

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

相关总结

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

点赞
收藏

评论区

加载中...

相关推荐

STM32使用HAL库实现按键的单击、双击、长按

STM32使用HAL库实现按键的单击、双击、长按目录STM32使用HAL库实现按键的单击、双击、长按前言具体思路工程配置代码实现实验效果前言编程开发环境:STM32

UIWebView长按保存图片和识别图片二维码的实现方案(使用缓存)

0x00需求:长按识别UIWebView中的二维码,如下图长按识别二维码0x01方案1:给UIWebView增加一个长按手势,激活长按手势时获取当前UIWebView的截图,分析是否包含二维码。核心代码:略优点:流程简单,可以快速实现。不足:无法实现保存UIWebView中图片,如果当前We

Android零基础入门第41节:使用SimpleAdapter

  通过ArrayAdapter实现Adapter虽然简单、易用,但ArrayAdapter的功能比较有限,它的每个列表项只能给一个TextView动态填充内容。如果开发者需要实现更复杂的列表项,则可以考虑使用SimpleAdapter。!(http://si1.go2yd.com/getimage/0FtTjblBPiy)一、使用Simp

Taro 鸿蒙技术内幕系列(三) - 多语言场景下的通用事件系统设计

作者:京东零售朱天健基于Taro打造的京东鸿蒙APP已跟随鸿蒙Next系统公测,本系列文章将深入解析Taro如何实现使用React开发高性能鸿蒙应用的技术内幕背景在鸿蒙生态系统中,虽然原生应用通常基于ArkTS实现,但在实际研发过程中发现,使用C可以显