Как плавно перемещать мышь по экрану с помощью 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);
}
Другие вопросы по тегам