HarmonyOS 鸿蒙Next基础手势:单/双/多次点击手势、长按手势、拖动手势及案例

发布于 1周前 作者 bupafengyu 最后一次编辑是 5天前 来自 鸿蒙OS

1 TapGesture-单/双/多次点击手势 支持单击、双击和多次点击事件的识别。使用方式如下:

TapGesture(value?: { count?: number, fingers?: number })

.onAction(event: (event?: GestureEvent) => void)//Tap手势识别成功回调。

count:识别的连续点击次数。当设置的值小于1或不设置时,会被转化为默认值1。 fingers:触发点击的手指数,最小为1指, 最大为10指。当设置小于1的值或不设置时,会被转化为默认值1。

import promptAction from '@ohos.promptAction'
@Entry
@Component
struct TapGestureTest {
  @State value: string = ''

  build() {
    Column() {
      // 单指双击文本触发手势事件
      Text('点击两次触发事件').fontSize(28)
        .gesture(
          TapGesture({ count: 2 })
            .onAction(() => {
              promptAction.showToast({message:"点击两次事件"})
            })
        )
    }
    .height(200)
    .width(300)
    .padding(20)
    .border({ width: 3 })
    .margin(30)
  }
}

2 LongPresGesture-长按手势 用于触发长按手势事件,触发长按手势的最少手指数为1,最短长按时间为500毫秒,用法如下:

LongPressGesture(value?: { fingers?: number, repeat?: boolean, duration?: number })

fingers:触发长按的最少手指数,最小为1指, 最大取值为10指。默认值:1。 repeat:是否连续触发事件回调。默认值:false。 duration:触发长按的最短时间,单位为毫秒(ms)。默认值:500ms。 以上LongPressGesture执行后可以调用如下三种事件:

案例代码如下:

@Entry
@Component
struct LongPressGestureTest {
  @State count: number = 0

  build() {
    Column() {
      Text('长按计数:' + this.count).fontSize(28)
        // 单指长按文本触发该手势事件
        .gesture(
          LongPressGesture({ repeat: true })
            // 由于repeat设置为true,长按动作存在时会连续触发,触发间隔为duration(默认值500ms)
            .onAction((event: GestureEvent) => {
              if (event.repeat) {
                this.count++
              }
            })
              // 长按动作一结束触发
            .onActionEnd(() => {
              this.count = 0
            })
        )
    }
    .height(200)
    .width(300)
    .padding(20)
    .border({ width: 3 })
    .margin(30)
  }
}

3 PanGesture-拖动手势 PanGesture用于触发拖动手势事件,滑动的最小距离为5vp时拖动手势识别成功,用法如下:

PanGesture(value?: { fingers?: number; direction?: PanDirection; distance?: number } | PanGestureOptions)

fingers:触发拖动的最少手指数,最小为1指, 最大取值为10指。默认为1。 direction:触发拖动的手势方向,此枚举值支持逻辑与(&)和逻辑或(|)运算。默认值:PanDirection.All ,表示所有方向。具体参考:https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-pangesture-0000001427744804-V3#ZH-CN_TOPIC_0000001523808626__pandirection枚举说明 distance:最小拖动识别距离,单位为vp。默认5vp。 PanGesture可以调用的事件如下:

案例代码如下:

import promptAction from '@ohos.promptAction'
@Entry
@Component
struct PanGestureTest {

  //手势坐标
  @State offsetX: number = 0
  @State offsetY: number = 0

  private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.Left | PanDirection.Right })

  build() {
    Column() {
      Column() {
        Text('PanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
      }
      .height(200)
      .width(300)
      .padding(20)
      .border({ width: 3 })
      .margin(50)
      // 左右拖动触发该手势事件
      .gesture(
        PanGesture(this.panOption)
          .onActionStart((event: GestureEvent) => {
            promptAction.showToast({message:"触发 onActionStart 事件"})
          })
          .onActionUpdate((event: GestureEvent) => {
            this.offsetX = event.offsetX
            this.offsetY = event.offsetY
            promptAction.showToast({message:"触发 onActionUpdate 事件"})
          })
          .onActionEnd(() => {
            promptAction.showToast({message:"触发 onActionEnd 事件"})
          })
      )
    }
  }
}
复制
5   案例
image.png

代码实现如下:

import promptAction from '@ohos.promptAction'
@Entry
@Component
struct GestureExample {
  @State
  offsetY:number = 0 //拖动组件Y方向offset

  @State
  text:string = '下拉刷新页面...'

  build() {
    Stack(){
      Row(){
        LoadingProgress()
          .width(32)
          .aspectRatio(1)

        Text(this.text)
          .width(120)
          .fontColor('#878787')

      }

      List(){
        ListItem(){
          Text(`${this.offsetY}`)
        }

      }.width('100%')
      .height('100%')
      .backgroundColor(Color.White)
      //拖动组件
      .translate({y:this.offsetY})
      .gesture(
        PanGesture()
          .onActionUpdate((event:GestureEvent)=>{
            //组件不能向上移动
            if(event.offsetY >0){
              this.offsetY = this.offsetY>100 ? this.offsetY+event.offsetY*0.01 : event.offsetY
              this.text = '释放立即刷新'
            }

          })
          .onActionEnd(()=>{

            //如果Y轴方向下拉太大,那么松手后先在100位置暂停1s后,再回弹
            if(this.offsetY >100){

              //先动画到100位置
              animateTo({duration:200},()=>{
                this.offsetY= 100
                this.text = "刷新中"
              })

              setTimeout(()=>{
                animateTo({duration:200},()=>{
                  this.offsetY= 0
                  this.text = ""
                })

              },1000)

            }else{
              animateTo({duration:200},()=>{
                this.offsetY= 0
              })
            }

            //设置定时,显示刷新成功
            setTimeout(()=>{
              promptAction.showToast({message:"刷新成功~"})
            },1000)

          })
      )

    }.width('100%')
    .height('100%')
    .backgroundColor('#AAA')
    .alignContent(Alignment.Top)
  }
}
1 回复

作为IT专家,对于HarmonyOS鸿蒙Next的基础手势有一定了解,以下是相关介绍及案例:

HarmonyOS鸿蒙Next支持多种基础手势,包括单/双/多次点击手势、长按手势和拖动手势。

  1. 点击手势(TapGesture):支持单次和多次点击,可通过“count”参数设置连续点击次数,默认值为1;通过“fingers”参数设置触发点击的手指数量,默认值为1。例如,为Text组件绑定双击手势,可设置“count”为2。
  2. 长按手势(LongPressGesture):通过“fingers”参数设置触发长按手势所需的最少手指数量,默认值为1;通过“repeat”参数设置是否连续触发事件回调,默认值为false;通过“duration”参数设置触发长按所需的最短时间,单位为毫秒,默认值为500。
  3. 拖动手势(PanGesture):用于触发拖动手势事件,滑动达到最小滑动距离(默认值为5vp)时拖动手势识别成功。通过“fingers”参数设置触发拖动手势所需的最少手指数量;通过“direction”参数设置触发拖动的手势方向;通过“distance”参数设置触发拖动的最小拖动识别距离。

案例:可为Text组件绑定上述手势,并通过回调函数实现相应功能,如修改组件状态、更新布局位置信息等。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部