Leap Motion: как сделать так, чтобы свайп срабатывал только один раз за свайп?

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

Наклон вверх и вниз прокручивает элементы меню, смахивание вправо выбирает этот элемент, смахивание влево возвращает на уровень меню вверх.

Проблема, с которой я сталкиваюсь, заключается в том, что когда вы проводите пальцем вправо по меню «список исполнителей», оно затем переходит в меню «песни», и поскольку жест смахивания в прыжке работает с кадрами, он запускает мою функцию несколько раз, поэтому первая песня выбирается сразу.

Вот соответствующий код:

var updateSelection = function() {
  if(Math.floor(x) == x && $.isNumeric(x)){
    var listLength = $(menu + ' li').size();
    if (x > listLength) x = listLength;
    if (x < 1) x = 1;
    $(menu + ' li').removeClass('active');
    $(menu + ' #' + x + artist ).addClass('active');
     scrollToIt = x + artist;
     idTagX = x;
     if (scrollDirection == "down") {
      var topPos = document.getElementById(scrollToIt).offsetTop;
      document.getElementById('cssmenu').scrollTop = topPos;
      //document.getElementById(scrollToIt).scrollIntoView();
    }
    else if (scrollDirection == "up"){
      var topPos = document.getElementById(scrollToIt).offsetTop;
      document.getElementById('cssmenu').scrollTop = topPos;
      //document.getElementById(scrollToIt).scrollIntoView(true);
    }
  }
}
if(frame.hands.length > 0)
{
  var hand = frame.hands[0];

  pitchRadians = hand.pitch();

  if (pitchRadians > 0.45) {
   newX = x - 0.1;
   x = roundNumber(newX, 2);
   scrollDirection = "up";
   updateSelection();
 }
 else if (pitchRadians < -0.45){
  newX = x + 0.1;
  x = roundNumber(newX, 2);
  scrollDirection = "down";
  updateSelection();
}
else {
  x = parseInt(x);
  updateSelection();
}

}
//--------------------------------------------------Swipe Selection
if (frame.gestures.length > 0) {
  for (var i = 0; i < frame.gestures.length; i++) {
    var gesture = frame.gestures[i];

    //---- Swipe ----
    if (gesture.type == "swipe") {
      var isHorizontal = Math.abs(gesture.direction[0]) > Math.abs(gesture.direction[1]);
      if(isHorizontal){
        if(gesture.direction[0] > 0){

          $(menu + ' #' + idTagX + artist).click();

          console.log(artist);
        } else {
          console.log("Menu Left");
         // $("#" + artist).hide();
          //menu = ".artists"
        }
      } else {
        // Vertical swipe              
      }
    }
  }
}


})

Это вполне может быть простым исправлением, я просто слишком долго смотрел на этот код, чтобы понять его.


person Will_P    schedule 26.05.2014    source источник


Ответы (1)


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

var prevSwipe = "";
var d = new Date();
var now = d.getTime();
var prevSwipeTime = now;


function rightSwipe () {
          d = new Date();
         if(prevSwipe == "right") {
                    if(prevSwipeTime + 1000 < d.getTime()) { //time elapsed, run code
                              $(menu + ' #' + idTagX + artist).click();
                              prevSwipe = "right";
                              prevSwipeTime = d.getTime();
                              console.log("prev == right");
                    } // otherwise do nothing
          } else {
                   $(menu + ' #' + idTagX + artist).click();
                    prevSwipe = "right";
                    prevSwipeTime = d.getTime();
                    console.log(prevSwipeTime);
                    console.log("prev != right");
          }
}

Надеюсь, это кому-нибудь поможет!

person Will_P    schedule 26.05.2014
comment
Большое спасибо, я пытался сделать то же самое на С#, и ваша логика дала мне ответ. Очень ценю! - person Ryanas; 06.10.2014
comment
Ничего страшного, рад, что пригодилось! - person Will_P; 06.10.2014