使用hammer.js 的Y-pan 事件延迟

Posted

技术标签:

【中文标题】使用hammer.js 的Y-pan 事件延迟【英文标题】:Y-pan event delay with hammer.js 【发布时间】:2021-05-21 22:28:49 【问题描述】:

以下脚本是在基于 Phaser 的应用程序中强制垂直运动(左右上下)的基本导航。我的问题是 y 方向平移事件触发的显着延迟,这使得应用程序非常难以使用。这显然是一个事件问题,而不是参数敏感性问题,因为调整参数对延迟没有影响。

注意事项:

立即检测到 x 轴平移 将单个手势从 x-pan 转换为 y-pan 时,后者没有延迟 在启动新的 y 轴平移(向上或向下)时,在事件触发之前会有明显的延迟(约 0.5 秒)。

任何想法如何解决这个问题?

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="//cdn.jsdelivr.net/npm/phaser@3.52.0/dist/phaser.js"></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/phaser@3.52.0/dist/phaser-arcade-physics.min.js"></script> -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.js'></script>
</head>
<body>
<div id="game-area"></div>
<script>

var config = 
    parent: 'game-area', type: Phaser.AUTO, width: 800, height: 600,
    backgroundColor: '#aaa', scene:  create: create, update: update 


var player;

function create () 
    var light_wall_graphics = this.add.graphics( fillStyle:  color: 0xffff00  );
    player = new Phaser.Geom.Rectangle( 400, 300, 50, 50 );
    player = light_wall_graphics.fillRectShape(player);


function update () 

    if ( Math.abs(g.x) > 1 ) 
        player.x += Math.sign(g.x) * 10;
        g = "x": 0, "y": 0 ;  // reset
    

    if ( Math.abs(g.y) > 1 ) 
        player.y += Math.sign(g.y) * 10;
        g = "x": 0, "y": 0 ;
    


var game = new Phaser.Game(config, 'game-area');

// hammer listener
var g = "x": 0, "y": 0 
var target = document.getElementById('game-area');
var hammertime = new Hammer(target,  velocity: 0.1, threshold: 0 );
hammertime.on('pan', function(ev)  g.x += ev.velocityX; g.y += ev.velocityY; );

</script>
</body>
</html>

【问题讨论】:

也发布在hammer.js github github.com/hammerjs/hammer.js/issues/1272 【参考方案1】:

解决方法是将平移方向设置为“DIRECTION_ALL”。

因为锤子的默认平移方向是水平的。 https://github.com/hammerjs/hammer.js/blob/master/src/hammer.js#L93

【讨论】:

你应该如何声明它? var mcCompass = new Hammer(目标, inputClass:Hammer.TouchMouseInput,方向:Hammer.DIRECTION_ALL );它似乎对我没有任何作用。【参考方案2】:

工作答案(对我来说)在另一个给定的线程中给出:

您需要指定识别器 Hammer.Pan

https://github.com/hammerjs/hammer.js/issues/1272

var mcCompass = new Hammer(
target, 

    inputClass: Hammer.TouchMouseInput,
    recognizers: [
        [Hammer.Pan]
    ]
);

【讨论】:

以上是关于使用hammer.js 的Y-pan 事件延迟的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 使用 Hammer.js 拖动事件在 div 上拖放元素

移动端手势事件 hammer.JS插件

Hammer.js分析——input.js

Hammer.js分析——recognizer.js

使用 Hammer.js 时移动 Safari 崩溃

hammer.js中的rotate旋转事件为啥没有效果