更新记录

1.0.0(2025-09-17) 下载此版本


## [1.0.0] - 2025-09-17
### Added
-   初次发布。
-   实现单点手势:点击、双击、长按、拖拽、滑动。
-   实现多点触控手势:双指缩放、旋转。
-   提供丰富的手势数据(位移、速度、方向、比例、角度、中心点等)。
-   支持高度自定义配置(开关、阈值、时间间隔)。
-   提供作用域插槽用于响应式 UI 更新。
-   完善的事件系统。

平台兼容性

uni-app(3.6.9)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

uni-app x(3.6.9)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

其他

多语言 暗黑模式 宽屏模式

hy-gesture-recognizer 增强型手势识别器

一个功能强大、配置灵活的 uni-app 手势识别组件,支持单点与多点触控。

特性

  • 👆 丰富的手势支持: 点击、双击、长按、拖拽、滑动、缩放、旋转。
  • ⚙️ 高度可配置: 可自定义各种手势的阈值和参数。
  • 🚀 高性能: 优化算法,流畅识别。
  • 🌐 多端兼容: 支持 App、H5、各大小程序平台。
  • 🔒 无权限依赖: 纯前端交互组件。

安装

通过 HBuilderX 的 uni_modules 导入本插件,或手动将本插件放入你项目的 uni_modules 目录下。

使用方法

基本使用

包裹你的组件,并监听需要的手势事件。

<template>
  <view>
    <hy-gesture-recognizer
      :enable-tap="true"
      :enable-double-tap="true"
      :enable-long-press="true"
      :enable-pan="true"
      :enable-swipe="true"
      :enable-pinch="true"
      :enable-rotate="true"
      @tap="onTap"
      @doubletap="onDoubleTap"
      @longpress="onLongPress"
      @pan="onPan"
      @swipe="onSwipe"
      @pinch="onPinch"
      @rotate="onRotate"
      @gesturestart="onGestureStart"
      @gesturechange="onGestureChange"
      @gestureend="onGestureEnd"
    >
      <!-- 你的可交互组件内容,例如一张图片、一个地图或一个自定义视图 -->
      <view class="gesture-target">在此区域进行手势操作</view>
    </hy-gesture-recognizer>
  </view>
</template>

<script>
export default {
  methods: {
    onTap(e) {
      console.log('Tap:', e);
      uni.showToast({ title: '点击了', icon: 'none' });
    },
    onDoubleTap(e) {
      console.log('Double Tap:', e);
      uni.showToast({ title: '双击了', icon: 'none' });
    },
    onLongPress(e) {
      console.log('Long Press:', e);
      uni.showToast({ title: '长按了', icon: 'none' });
    },
    onPan(e) {
      console.log('Pan - deltaX:', e.deltaX, 'deltaY:', e.deltaY);
      // 通常用于移动元素
    },
    onSwipe(e) {
      console.log('Swipe - direction:', e.direction);
      uni.showToast({ title: `向${e.direction}滑动`, icon: 'none' });
    },
    onPinch(e) {
      console.log('Pinch - scale:', e.scale);
      // 通常用于缩放元素
    },
    onRotate(e) {
      console.log('Rotate - rotation:', e.rotation);
      // 通常用于旋转元素
    },
    onGestureStart(e) {
      console.log('Gesture Started:', e.type);
    },
    onGestureChange(e) {
      // 实时更新
    },
    onGestureEnd(e) {
      console.log('Gesture Ended:', e.type);
    }
  }
};
</script>

<style>
.gesture-target {
  width: 300px;
  height: 300px;
  background-color: #f0f0f0;
  display: flex;
  justify-content: center;
  align-items: center;
  border: 1px dashed #ccc;
}
</style>

配置属性 (Props)

属性                  类型      默认值 说明
enable-tap          Boolean true    是否启用点击手势
enable-double-tap   Boolean false   是否启用双击手势
double-tap-interval Number  300     双击时间间隔(毫秒)
enable-long-press   Boolean false   是否启用长按手势
long-press-time     Number  500     长按触发时间(毫秒)
enable-pan          Boolean false   是否启用拖拽手势
enable-swipe        Boolean false   是否启用滑动手势
swipe-threshold     Number  10      滑动最小距离阈值(单位px)
enable-pinch        Boolean false   是否启用缩放手势
enable-rotate       Boolean false   是否启用手势
prevent-default     Boolean false   是否阻止默认事件

事件 (Events)

事件名          说明             回调参数
@tap            点击时触发           GestureEvent
@doubletap      双击时触发           GestureEvent
@longpress      长按时触发           GestureEvent
@pan            拖拽过程中持续触发   GestureEvent
@swipe          滑动结束时触发     GestureEvent
@pinch          缩放过程中持续触发   GestureEvent
@rotate         旋转过程中持续触发   GestureEvent
@gesturestart   任何手势开始时触发   GestureEvent
@gesturechange  任何手势变化时触发   GestureEvent
@gestureend     任何手势结束时触发   GestureEvent

GestureEvent 对象结构:

{
  type: string, // 手势类型 ('tap', 'swipe', 'pinch'等)
  state: string, // 状态 ('start', 'move', 'end')
  pointers: Array<{ identifier: number, x: number, y: number }>, // 当前触点
  startPointers: Array<{ identifier: number, x: number, y: number }>, // 起始触点
  scale: number, // 缩放比例
  rotation: number, // 旋转角度(度数)
  deltaX: number, // X轴位移
  deltaY: number, // Y轴位移
  velocityX: number, // X轴速度
  velocityY: number, // Y轴速度
  direction: string, // 方向 ('left', 'right', 'up', 'down', 'none')
  center: { x: number, y: number }, // 手势中心点
  timeStamp: number, // 时间戳
  nativeEvent: TouchEvent // 原生事件对象
}

作用域插槽 (Scoped Slot)

组件提供了作用域插槽,可将手势数据传递给子组件,实现更灵活的响应式交互。

<hy-gesture-recognizer :enable-pinch="true" :enable-rotate="true">
  <template #default="{ gestureData }">
    <view
      class="transformable-element"
      :style="{
        transform: `scale(${gestureData.scale}) rotate(${gestureData.rotation}deg)`
      }"
    >
      根据手势数据实时变换的元素
    </view>
  </template>
</hy-gesture-recognizer>

注意事项

1.手势冲突: 如果父容器有滚动条,某些拖拽或滑动手势可能会触发页面滚动。可以通过 prevent-default 属性尝试阻止默认行为,或在特定条件下手动控制。
2.性能考虑: 高频触发的事件(如 pan, pinch, rotate)中不要执行过于复杂的逻辑,以免造成页面卡顿。
3.平台差异: 虽然组件已处理多端兼容性,但不同平台底层 Touch 事件的细微差异仍可能存在。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议