【问题标题】:Gesture and touch events - smoothly resize a square手势和触摸事件 - 平滑调整正方形的大小
【发布时间】:2012-05-30 17:28:49
【问题描述】:

我有一个蓝色的#square 在我的 iOS 设备的视口中垂直和水平居中……

<div id="square"></div>
#square {
    width:100px;
    height:100px;
    background:blue;
    margin:0 auto;
}

我想在手机上进行捏合/缩放手势时在最小值和最大值范围内调整它的大小。

现在,这就是我使用的所有 javascript。

$(document).ready(function() {

    var dom = document.body,
        _width = parseInt($('#square').css('width')),
        vel = 3,
        min = _width,
        max = 300,
        scale;

    dom.addEventListener("gesturechange", gestureChange, false);

    function gestureChange(e) {

        e.preventDefault();

        scale = e.scale;
        _width = Math.round(_width*(scale/vel));

        if ( _width <= max && _width >= min )
            $('#square').css({
                'width' : _width + 'px',
                'height' : _width + 'px'
            });

        if ( _width > max ) _width = max;
        if ( _width < min ) _width = min;
    }


});

但是,整个调整大小的体验感觉有点不稳定,并且对我的手指的反应不是很流畅。它确实有效,但没有我想要的那么顺利。

首先。我真的不明白javascript“触摸”事件和javascript“手势”事件之间的区别。我需要更多的事件监听器吗?像 gestureStartgestureEnd 这样可以正常工作吗?

我现在遇到的问题是,当我放大 #square 时,它会非常快地跳到它的最大值 (300),但我无法用手指准确地控制它的大小。而且,一旦调整大小,我在做缩小手势时也很难再次减小大小。

我把我当前的代码放在 jsfiddle 上,这样你就可以自己测试了。 http://jsfiddle.net/Ec3az/

也许有人可以在这里帮助我,因为我很想完成这篇文章。总体结果应该只是在智能手机上放大和缩小时获得真正流畅的体验和对正方形大小的实际控制。

提前谢谢你

编辑:顺便说一句。我喜欢只使用标准的触摸事件,而不是使用额外的库。

【问题讨论】:

  • 在 iOS 上,一些“触摸”事件(更复杂的 [双指] 事件)也会生成“手势”事件。您可以将(通用)触摸事件视为更“原始”,而附加(不太普遍支持的)手势事件则更“熟”。 “手势”事件可能更方便使用......如果它们存在的话。但是由于必要的延迟(一个触摸是滚动的开始,还是很快就会变成两指捏的开始?)它们往往不会很快被触发到 Javascript(尽管额外的时间只有几毫秒和人类通常几乎看不到)。

标签: javascript jquery ios touch gesture


【解决方案1】:

您遇到的问题是,当您收到新的手势更改事件时,您正在缩放正方形的当前宽度,而实际上您想要缩放正方形的原始宽度和高度。以你的方式做这件事会累积每一次规模的变化,并导致正方形的大小迅速增加,这就是你所经历的。

缩放完成后,我们还需要将原来的宽度更新为当前宽度,这样下次用户缩放时,它会从正确的大小开始缩放。

因此,这会带来更流畅的体验,因为它始终会缩放原始宽度:

var dom = document.body,
    _width = parseInt($('#square').css('width')),
    vel = 5.0,
    min = _width,
    max = 300,
    scale;

dom.addEventListener("gesturechange", gestureChange, false);
dom.addEventListener("gestureend", gestureEnd, false);

function gestureChange(e) {

    e.preventDefault();

    scale = e.scale;
    var tempWidth = _width * scale;

    if (tempWidth > max) tempWidth = max;
    if (tempWidth < min) tempWidth = min;

    $('#square').css({
        'width': tempWidth + 'px',
        'height': tempWidth + 'px'
    });
}

function gestureEnd(e) {

    e.preventDefault();
    _width = parseInt($('#square').css('width'));
}

这个小提琴在 iPad 1、iOS 5.1 上似乎很流畅。什么的! :)

http://jsfiddle.net/D9NC3/

另外,关于手势和触摸事件,我在许多浏览器中都支持触摸事件(android、iOS safari 和 Firefox,似乎是http://caniuse.com/#search=touch),但据我所知,手势事件是专有的到 iOS Safari。它们基本上可以帮助您处理 iOS 类型的手势(捏合和缩放、旋转等),因此您不必自己实现手势检查。

希望对你有帮助!

【讨论】:

  • 你看过我最近的编辑吗?我只是注意到自己并修复了它! :)
  • @S.B.看起来它只是 OP 原始代码中未使用的变量。我想我一定是错过了把它拿出来。
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 2014-07-03
  • 1970-01-01
  • 2011-01-01
  • 2012-03-31
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多