移动端怎么正确识别捏合手势缩放?
我在做移动端图片预览功能,想用原生 JS 实现捏合缩放,但试了 touchstart 和 touchmove 事件,两个手指的距离计算好像不对,缩放时特别卡顿还容易误触。
我用的是 event.touches.length === 2 判断双指,然后算两点间距离,但有时候会突然跳变。有没有更稳定的实现方式?
function getDistance(touch1, touch2) {
const dx = touch2.clientX - touch1.clientX;
const dy = touch2.clientY - touch1.clientY;
return Math.sqrt(dx * dx + dy * dy);
}
第二步,计算两点之间的距离。你写的 getDistance 函数是没问题的,但是确实会出现跳变的情况。这是因为触摸点的位置变化可能会导致计算不连续。我们需要在每次触摸移动的时候记录上一次触摸点的位置,然后计算两次触摸位置的变化量,这样可以减少跳变。
第三步,处理缩放逻辑。我们可以使用一个 scale 变量来存储当前的缩放比例,并且在 touchmove 事件中更新这个值。同时,我们需要限制缩放的比例范围,避免用户把图片缩放到太小或者太大。
第四步,应用缩放效果。我们可以使用 CSS 的 transform 属性来实现缩放效果,这样可以利用浏览器的硬件加速,让动画更加流畅。
下面是一个完整的代码示例,包含了以上所有的逻辑:
这段代码里,我们做了以下几个事情:
1. 监听 touchstart 事件,当检测到两个触摸点时,开始记录捏合状态和相关参数。
2. 在 touchmove 事件中,计算两个触摸点之间的距离变化,并更新图片的缩放比例和位置。
3. 在 touchend 事件中,检查触摸点数量,如果少于两个,则结束捏合状态。
这样处理后,应该能有效减少缩放过程中的跳变和卡顿问题。希望这个示例对你有帮助!