2012-02-22 4 views
2

Существует метод mouseMove(), который переводит указатель в это место. Я хочу, чтобы мы могли плавно перемещаться по экрану. Мне нужно написать метод с именем mouseGLide(), который принимает начало x, начало y, конец x, конец y, общее время, в которое должно выполняться скольжение, и количество шагов, которые нужно выполнить во время скольжения. Он должен анимировать указатель мыши, перейдя от (start x, start y) до (end x, start y) с помощью n шагов. Общее скольжение должно составлять t миллисекунды.Как перемещать мышь плавно по всему экрану с помощью java?

Я не знаю, с чего начать, может ли кто-нибудь помочь мне начать с этого? Может кто-нибудь просто скажет мне, какие шаги мне нужно сделать, чтобы эта проблема работала.

ответ

21

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

public void mouseGlide(int x1, int y1, int x2, int y2, int t, int n) { 

} 

Далее, давайте создадим объект робота, а также вычислим 3 части информации, которые помогут вам в будущих расчетах. Не забудьте поймать исключение из экземпляра Robot.

Robot r = new Robot(); 
double dx = (x2 - x1)/((double) n); 
double dy = (y2 - y1)/((double) n); 
double dt = t/((double) n); 

dx представляет разность х вашей мыши координат каждый раз она движется в то время как скользя. В основном это общее расстояние перемещения, разделенное на n шагов. То же самое с dy, за исключением координаты y. dt - общее время скольжения, разделенное на n шагов.

И, наконец, постройте цикл, который выполняет n раз, каждый раз перемещая мышь ближе к окончательному местоположению (делая шаги (dx, dy)). Сделайте нить за dt миллисекундами во время каждого исполнения. Чем больше ваш n, тем гладче будет скольжение.


Окончательный результат:

public void mouseGlide(int x1, int y1, int x2, int y2, int t, int n) { 
    try { 
     Robot r = new Robot(); 
     double dx = (x2 - x1)/((double) n); 
     double dy = (y2 - y1)/((double) n); 
     double dt = t/((double) n); 
     for (int step = 1; step <= n; step++) { 
      Thread.sleep((int) dt); 
      r.mouseMove((int) (x1 + dx * step), (int) (y1 + dy * step)); 
     } 
    } catch (AWTException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
+0

спасибо за Ваш ответ! хотя он не был принят апеллятором, это действительно помогло мне :-), но вы можете в основном избавиться от задержки сна, потому что он становится очень медленным, если в любом случае есть много шагов. – moeTi

+0

было бы уточнить, как долго происходит просыпание и перемещение, а затем спят (dt - timeSinceLastMove) вместо того, чтобы всегда использовать dt (для этого потребуется выполнить переход до сна и, вероятно, начать с шага 0 вместо шаг 1). – tucuxi

Смежные вопросы