Как плавно перемещать мышь по экрану с помощью Java?
Существует метод mouseMove(), который заставляет указатель перейти в это место. Я хочу, чтобы мышь плавно двигалась по экрану. Мне нужно написать метод с именем mouseGLide(), который принимает начало x, начало y, конец x, конец y, общее время, которое должно пройти скольжение, и количество шагов, которые нужно выполнить во время скольжения. Он должен анимировать указатель мыши, перемещаясь от (начало x, начало y) к (конец x, начало y) за n шагов. Общее скольжение должно занять t миллисекунд.
Я не знаю, с чего начать Кто-нибудь может мне помочь начать это? Может кто-нибудь просто сказать мне, какие шаги мне нужно сделать, чтобы эта проблема работала.
3 ответа
Для начала давайте просто напишем пустой метод, параметры которого будут такими, как вы определили в своем вопросе.
public void mouseGlide(int x1, int y1, int x2, int y2, int t, int n) {
}
Далее, давайте создадим объект Robot, а также рассчитаем 3 элемента информации, которые помогут вам в будущих расчетах. Не забудьте поймать исключение из создания робота.
Robot r = new Robot();
double dx = (x2 - x1) / ((double) n);
double dy = (y2 - y1) / ((double) n);
double dt = t / ((double) n);
dx
представляет разницу в координате х вашей мыши каждый раз, когда она движется во время скольжения. В основном это общее расстояние перемещения, разделенное на n
шаги. То же самое с dy
кроме как с координатой у. 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();
}
}
Для всех тех, кто боролся с программированием, как я делал раньше, вот как вы реализуете этот метод и используете его правильно:
public class gliding_the_mouse {
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();
} }
public static void main (String[] args) { // program initialization
gliding_the_mouse x = new gliding_the_mouse(); // we declare what are we gonna use
x.mouseGlide(400,500,700,700,5000,10000); // the smaller the time value, the faster the mouse glides.
} } // P.s I am new to Stackru, so I am not particular experienced with it, sorry for ugly design
Используя нет. шагов не может быть идеальным в каждой ситуации. Ниже приведен код, который перемещает мышь на заданное количество пикселей.
Идея этой логики заключается в том, что мы предоставляем начальную и конечную точки и:
- получаем уравнение прямой для двух точек
- определяем точки (прыжок пикселя) вдоль линии
- мы перемещаем мышь в каждую идентифицированную точку на линии, используя очень минимальную задержку, чтобы воспроизвести общее движение мыши.
/**
* Moves mouse from (x1,y1) to (x2, y2).
*
* @param x1 initial x
* @param y1 initial y
* @param x2 x
* @param y2 y
*/
private static void moveTo(final int x1, final int y1, final int x2, final int y2) {
int pixelJump = 10;
final double xSqu = (x2 - x1) * (x2 - x1);
final double ySqu = (y2 - y1) * (y2 - y1);
final double lineLength = Math.sqrt(xSqu + ySqu);
double dt = 0;
while (dt < lineLength) {
dt += pixelJump;
final double t = dt / lineLength;
final int dx = (int) ((1 - t) * x1 + t * x2);
final int dy = (int) ((1 - t) * y1 + t * y2);
r.mouseMove(dx, dy);
r.delay(1); // Increase this number if you need to delay the mouse movement
}
r.mouseMove(x2, y2);
}