【问题标题】:html5 canvas - touchmove - how to calculate velocity and direction?html5 canvas - touchmove - 如何计算速度和方向?
【发布时间】:2013-04-12 02:01:23
【问题描述】:

所以我想测量用户在 html5 画布上滑动的速度和方向?

似乎应该已经写了一些东西来做到这一点,所以我不必重新发明轮子,但我找不到任何东西。有人知道 JavaScript 函数吗?

如果我必须自己做,我会这样想:

  • 获取触摸事件 x 和 y,将它们存储在数组变量中
  • 计算 2 点之间的斜率(如果斜率不同,可以取平均值)
  • 不确定如何测量速度,也许是点之间的距离?

还有其他想法吗?

这是我的画布和形状,它会监听触摸事件。当触摸我的 iphone 或 iphone 模拟器时,我通常会收到 1 或 2 个事件。我看坐标。我正在为舞台和形状使用 kineticjs。

要尝试它,请在您的 iPhone 中访问此网址,然后将手指放在圆圈上并将其推到某个地方。 (或者如果你有 ios 模拟器,你也可以使用它)

这是我的小提琴: http://jsfiddle.net/jnylund/uRgZZ/16/

   function writeMessage(messageLayer, message) {
   var context = messageLayer.getContext();
   messageLayer.clear();
   context.font = '18pt Calibri';
   context.fillStyle = 'black';
   context.fillText(message, 10, 25);
   var div = document.getElementById('tevents');
   div.innerHTML = div.innerHTML + message + "<BR/>";

}

var stage = new Kinetic.Stage({
   container: 'container',
   width: 460,
   height: 320
});

var layer = new Kinetic.Layer();
var messageLayer = new Kinetic.Layer();

var circle = new Kinetic.Circle({
   x: stage.getWidth() / 2,
   y: stage.getHeight() / 2,
   radius: 40,
   fill: 'red',
   stroke: 'black',
   strokeWidth: 4 //,
   // draggable: true
});

circle.setX(230);
circle.setY(160);

circle.on('touchmove', function (event) {
   writeMessage(messageLayer, 'touch event length is ' + event.touches.length);
   for (var i = 0; i < event.touches.length; i++) {
       var touch = event.touches[i];
       writeMessage(messageLayer, 'event x: ' + touch.pageX + ', y: ' + touch.pageX);
   }

   var touchPos = stage.getTouchPosition();
   writeMessage(messageLayer, 'stage x: ' + touchPos.x + ', y: ' + touchPos.y);

});

// add the shape to the layer
layer.add(circle);

// add the layer to the stage
stage.add(layer);
stage.add(messageLayer);

谢谢 乔尔

【问题讨论】:

  • 到目前为止你做了什么?
  • 我的代码可以获取 touchmove 事件并记录它们,这样我就可以看到触发了什么。我还没有研究方向和速度,因为我希望不必构建自定义的东西。

标签: javascript html5-canvas touchmove


【解决方案1】:

您可以通过以下步骤轻松完成:

  • 触地,存储时间和位置
  • 修饰、存储时间和位置

在与修饰相同的处理程序中继续执行以下步骤:

要获得与您相关的因素,请按时差划分距离。值越高,速度越快。

【讨论】:

  • 我会试一试,谢谢,所以我想那里已经没有任何东西了
  • @Joelio 我已经制作了一个库 [easyCanvas](]easyCanvasJS.com) 可以为您执行此操作,但目前不支持触摸。该库还使用移动平均来计算速度,以获得更准确的速度值,如果保持物体静止,则为 0。该库是免费的 (GPL-3.0)。
【解决方案2】:

可以通过多种方式测量速度:

  • Timestamps 在您的初始点和最终点之间,以每毫秒像素为单位。
  • 帧速率,用于固定速率,以每帧像素或每秒像素为单位。

然后将值转换为应用中使用的比例,例如赛车的 kph 或 mph。

【讨论】:

  • 我添加了一些代码,在我的试验中,当我在 iPhone 上滑动时,我通常会得到 1 个或最多 2 个事件。我认为当我只收到 1 个事件时,时间戳不会很有效。您的建议是否有任何代码示例?
  • @Joelio 这个是怎么操作的?
  • 我不明白你的问题。你能澄清一下吗?
  • @Joelio 我该如何操作?向外触摸圆心?
  • 是的,把你的手指放在圆圈上,然后往某个方向推
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多