更新记录

0.0.5(2025-05-06)

  • fix: 缩放不保存的问题

0.0.4(2025-05-06)

  • fix 修复vue3引入问题

0.0.3(2025-05-06)

  • feat 更换目录
查看更多

平台兼容性

uni-app(4.44)

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

uni-app x(4.61)

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

其他

多语言 暗黑模式 宽屏模式
× ×

lime-gesture 手势库

手势处理函数,支持旋转、缩放、滑动等触摸交互。

文档

🚀 gesture【站点1】 🌍 gesture【站点2】 🔥 gesture【站点3】

安装

插件市场导入即可,uniapp 只能源码运行。uniappx 安卓/ios可以自定义基座,其它端需要源码

代码演示

<view ref="boxRef" class="box" style="background-color: #44bd87;"></view>
import { useGesture, type GestureOptions } from '@/uni_modules/lime-gesture'

const boxRef = ref<UniElement | null>(null)

const translateX = ref(0)
const translateY = ref(0)
const scale = ref(1)
const rotation = ref(0)

const gesture = useGesture(boxRef, {
    //缩放
    onPinch(zoom : number, _evt : UniTouchEvent) {
        scale.value = Math.min(Math.max(zoom, 0.5), 5)
    },
    // 旋转
    onRotate(angle : number, _evt : UniTouchEvent) {
        rotation.value += angle
    },
    // 单指移动
    onPressMove(delta, _evt : UniTouchEvent) {
        translateX.value += delta["deltaX"] as number
        translateY.value += delta["deltaY"] as number
    },
    // 双指移动
    onTwoPressMove(delta, _evt : UniTouchEvent) {
        translateX.value += delta["deltaX"] as number
        translateY.value += delta["deltaY"] as number
    }
} as GestureOptions)

// 给元素绑定加上
watchEffect(() => {
    if (boxRef.value == null) return
    boxRef.value!.style.setProperty('transform', `translate(${translateX.value}px, ${translateY.value}px) scale(${scale.value}) rotate(${rotation.value}deg)`)
})

手动模式

某些环境不支持给绑定事件,给useGesture第一个参数传入null,手动传递触摸事件(适用于复杂场景):

<view 
    ref="boxRef" 
    class="box" 
    style="background-color: #44bd87;"
    @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend">
</view>
const boxRef = ref<UniElement | null>(null)
const gesture = useGesture(null, {
    //缩放
    onPinch(zoom : number, _evt : UniTouchEvent) {
        scale.value = Math.min(Math.max(zoom, 0.5), 5)
    },
    // 旋转
    onRotate(angle : number, _evt : UniTouchEvent) {
        rotation.value += angle
    },
    // 单指移动
    onPressMove(delta, _evt : UniTouchEvent) {
        translateX.value += delta["deltaX"] as number
        translateY.value += delta["deltaY"] as number
    },
    // 双指移动
    onTwoPressMove(delta, _evt : UniTouchEvent) {
        translateX.value += delta["deltaX"] as number
        translateY.value += delta["deltaY"] as number
    }
} as GestureOptions)

// 传入开始事件
const touchstart = (e : UniTouchEvent) => {
    gesture.start(e)
}
// 传入移动事件
const touchmove = (e : UniTouchEvent) => {
    e.preventDefault()
    finger.move(e)
}
// 传入移动结束事件
const touchend = (e : UniTouchEvent) => {
    finger.end(e)
}

// 给元素绑定加上
watchEffect(() => {
    if (boxRef.value == null) return
    boxRef.value!.style.setProperty('transform', `translate(${translateX.value}px, ${translateY.value}px) scale(${scale.value}) rotate(${rotation.value}deg)`)
})

状态对象 (GestureState)

interface GestureState {
  scale: number        // 当前缩放比例
  angle: number        // 累计旋转角度
  deltaX: number       // X轴瞬时位移
  deltaY: number       // Y轴瞬时位移
  isDoubleTap: boolean // 是否为双击
  swipeDirection: 'Left' | 'Right' | 'Up' | 'Down' | null
}

⚙️ 配置选项 (GestureOptions)

属性名 类型 触发时机 参数说明
onRotate (angle: number, evt: UniTouchEvent) => void 双指旋转时持续触发 angle: 旋转角度(相对上次变化量,单位:度)
evt: 原始触摸事件对象
onPinch (scale: number, evt: UniTouchEvent) => void 双指缩放时持续触发 scale: 缩放比例(相对初始距离的倍数)
evt: 原始触摸事件对象
onSwipe (direction: 'Left'\|'Right'\|'Up'\|'Down', evt: UniTouchEvent) => void 快速滑动结束时触发(速度>30px/300ms) direction: 滑动方向
evt: 原始触摸事件对象
onTap (evt: UniTouchEvent) => void 单击结束时触发 evt: 原始触摸事件对象
onDoubleTap (evt: UniTouchEvent) => void 快速双击时触发(间隔<250ms) evt: 原始触摸事件对象
onLongTap (evt: UniTouchEvent) => void 长按超过750ms时触发 evt: 原始触摸事件对象
onSingleTap (evt: UniTouchEvent) => void 单击未被双击覆盖时触发(延迟250ms触发) evt: 原始触摸事件对象
onPressMove (delta: UTSJSONObject, evt: UniTouchEvent) => void 单指拖拽时持续触发 delta: 包含 deltaX/deltaY 的位移对象
evt: 原始触摸事件对象
onTwoPressMove (delta: UTSJSONObject, evt: UniTouchEvent) => void 双指拖拽时持续触发 delta: 包含 deltaX/deltaY 的位移对象
evt: 原始触摸事件对象
onTouchStart (evt: UniTouchEvent) => void 触摸开始时触发 evt: 原始触摸事件对象
onTouchMove (evt: UniTouchEvent) => void 触摸移动时触发 evt: 原始触摸事件对象
onTouchEnd (evt: UniTouchEvent) => void 触摸结束时触发 evt: 原始触摸事件对象
onTouchCancel (evt: UniTouchEvent) => void 触摸被系统取消时触发(如来电打断) evt: 原始触摸事件对象
onMultipointStart (evt: UniTouchEvent) => void 从单点触摸变为多点触摸时触发 evt: 原始触摸事件对象
onMultipointEnd (evt: UniTouchEvent) => void 从多点触摸变为单点/无触摸时触发 evt: 原始触摸事件对象

隐私、权限声明

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

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

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

暂无用户评论。

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问