2013-08-26 1 views
0

Я пытаюсь использовать leapmotion банку повторить движение мыши с жестом и движением руки, я создал два методане в состоянии переместить мышь и захватить жест с помощью контроллера Leapmotion в Скале

def executeGesture(gesture: Gesture) = { 

    val robot = new Robot(); 
    gesture.match { 
    case Gesture.Type.TYPE_CIRCLE => { 
     println("CIRCLE IT IS") 
     val circle = new CircleGesture(gesture); 

     if (circle.pointable().direction().angleTo(circle.normal()) <= Math.PI/4) { // Clockwise if angle is less than 90 degrees 
      //    robot.mousePress(InputEvent.BUTTON1_MASK) 
      //    robot.mouseRelease(InputEvent.BUTTON1_MASK) 
      //    robot.mousePress(InputEvent.BUTTON1_MASK) 
      //    robot.mouseRelease(InputEvent.BUTTON1_MASK) 

     } else { 

     } 
    } 
    case Gesture.Type.TYPE_SWIPE => { 
     val swipe = new SwipeGesture(gesture) 

     if (swipe.direction().getX() > 0) { 
      println("SWIPE Right") 

     } else { 
      println("SWIPE Left ") 
      robot.keyPress(KeyEvent.VK_ALT); 
      robot.keyPress(KeyEvent.VK_F4); 
      robot.keyRelease(KeyEvent.VK_ALT); 
      robot.keyRelease(KeyEvent.VK_F4); 
     } 
    } 
    case Gesture.Type.TYPE_SCREEN_TAP => { 
     val ScreenTap = new ScreenTapGesture(gesture) 
     println("Screen Tap " + ScreenTap.id()) 
    } 
    case Gesture.Type.TYPE_KEY_TAP => { 
     val KeyTap = new KeyTapGesture(gesture) 
     println("Key Tap " + KeyTap.id()) 
     robot.mousePress(InputEvent.BUTTON1_MASK) 
     robot.mouseRelease(InputEvent.BUTTON1_MASK) 
    } 
    case _ => println("Something ELSE!!. .") 
    } 
} 

def executeMovement(frame: Frame) { 
    val robot = new Robot 
      val finger = frame.fingers().get(0) 
      val gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice() 
      val Xwidth = gd.getDisplayMode().getWidth() 
      val Xheight = gd.getDisplayMode().getHeight() 

      val tipVelocity = finger.tipVelocity().magnitude().toInt 
      val position = finger.tipPosition() 

      if (tipVelocity > 2) { 
       prevPoint.x = nextPoint.x 
         prevPoint.y = nextPoint.y 

         val mouseX = (Xwidth + Math.round(position.getX() * (Xwidth/100))) 
         val mouseY = ((Xheight - (0.0F + position.getY() * 4.0F - Xheight/5))).toInt 

         nextPoint.x = mouseX 
         nextPoint.y = mouseY 

         val diffx = (prevPoint.x - nextPoint.x).abs 
         val diffy = (prevPoint.y - nextPoint.y).abs 

         if ((diffx > 4) & (diffy > 4)) { 
          robot.mouseMove(nextPoint.x, nextPoint.y) 
          //  moveMouse(prevPoint.x, prevPoint.y, nextPoint.x, nextPoint.y, 200, 30) 
         } 
      } 
} 

Executemovement перемещает мышь в направлении вашей руки, когда я комментирую выполнение execemovement, executeGesture распознает все жесты, но когда я запускаю оба этих метода, он не обнаруживает события Key_tap и Screen_tap. , И я не могу понять причину этого.

ответ

0

Я подозреваю, что вы пропускаете кадры, когда выполняете обе функции. Если ваш обработчик onFrame не возвращается достаточно быстро, программа Leap Motion будет пропускать кадры, пока это не будет выполнено. Жесты Screen и KeyTap отображаются только в одном кадре, поэтому их легко пропустить, если ваш код сбрасывает кадры. Путь вокруг этого заключается в том, чтобы сохранить ссылку на последний кадр, обработанный вашим кодом, и передать его в функцию Frame.gestures(sinceFrame). Это дает вам все объекты жестов, которые были сгенерированы между frame и текущим фреймом.