html5 canvas - touchmove - как рассчитать скорость и направление?

Итак, я хочу измерить, как быстро и в каком направлении пользователь проводит пальцем по холсту html5?

Кажется, для этого уже должно быть что-то написано, поэтому мне не нужно изобретать велосипед, но я ничего не могу найти. Кто-нибудь знает о функции JavaScript?

Если бы мне пришлось делать самому, я думаю так:

  • захватить события касания x и y, сохранить их в переменной массива
  • рассчитать наклон между двумя точками (возможно, усреднить его, если наклоны разные)
  • не уверен, как измерить скорость, может быть, расстояние между точками?

любые другие идеи?

Вот мой холст и моя форма, и он слушает события касания. При прикосновении к моему iphone или симулятору iphone я обычно получаю 1 или 2 события. Я вижу координаты. Я использую кинетику для сцены и формы.

Чтобы попробовать, перейдите по этому адресу в своем 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);

спасибо Джоэл


person Joelio    schedule 18.04.2013    source источник
comment
Что вы сделали до сих пор?   -  person Mohsen    schedule 18.04.2013
comment
У меня есть код, который получает события touchmove и регистрирует их, чтобы я мог видеть, что срабатывает. Я еще не работал над направлением и скоростью, так как надеюсь, что мне не придется создавать что-то нестандартное.   -  person Joelio    schedule 19.04.2013


Ответы (2)


Вы можете сделать это просто с помощью следующих шагов:

  • Прикоснитесь, сохраните время и положение
  • Прикоснитесь, сохраните время и положение

В том же обработчике, что и touch up, выполните следующие действия:

Чтобы получить коэффициент, относящийся к вам, разделите расстояние на разницу во времени. Чем выше значение, тем выше скорость.

person Community    schedule 19.04.2013
comment
Я попробую, спасибо, так что я думаю, что там уже ничего нет - person Joelio; 19.04.2013
comment
@Joelio Я сделал библиотеку [easyCanvas](]easyCanvasJS.com), которая может сделать это за вас, но в настоящее время сенсорный не поддерживается. Библиотека также использует скользящее среднее для расчета скорости, чтобы получить более точное значение скорости, а также получить 0, если объект неподвижен. Библиотека бесплатна (GPL-3.0). - person ; 27.09.2013

Скорость можно измерить несколькими способами:

  • Временные метки между начальной и конечной точками, измеренными в пикселей в миллисекунду.
  • Частота кадров для фиксированных значений измеряется в пикселях на кадр или пикселях в секунду.

Затем преобразуйте значения в масштаб, используемый в вашем приложении, например км/ч или миль/ч для гонок.

person Joseph    schedule 18.04.2013
comment
Я добавил некоторый код, в моих испытаниях я обычно получаю 1 или максимум 2 события, когда я прокручиваю свой iphone. Я думаю, что временная метка не будет очень эффективной, когда я получаю только 1 событие. Есть ли примеры кода для любого из ваших предложений? - person Joelio; 19.04.2013
comment
@Джоэлио, как ты это делаешь? - person Joseph; 19.04.2013
comment
Я не понимаю вашего вопроса. Вы можете уточнить? - person Joelio; 19.04.2013
comment
@Joelio как мне работать? коснуться в центре круга наружу? - person Joseph; 19.04.2013
comment
да, поместите палец на круг и нажмите его в каком-то направлении - person Joelio; 19.04.2013