更新记录

0.0.2(2025-03-12)

  • chore: 更新文档

0.0.1(2025-03-07)

  • init

平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
HBuilderX 4.53,Android:支持,iOS:支持,HarmonyNext:不确定 × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序 鸿蒙元服务
× × × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × ×

lime-gesture 手势库

安装

插件市场导入即可

代码演示

<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. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。

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