Движение мыши Java-робота: установка скорости?

Класс Java Robot позволяет перемещать мышь, как если бы была перемещена настоящая физическая мышь.

Однако как можно гуманным (и, следовательно, не мгновенно) перемещать мышь от Point1 к Point2? Ака, а как установить скорость передвижения?

Если такая скорость невозможна с классом Robot, таким образом, если мышь может перемещаться только мгновенно, какой «алгоритм» следует использовать для имитации движения мыши человека? Должен ли он перемещать мышь пиксель за пикселем с определенной скоростью приращения?


person Tom    schedule 17.03.2011    source источник


Ответы (3)


В классе Robot есть метод delay (...), который можно использовать для управления перемещением от точки к точке. Попробуйте использовать несколько различных алгоритмов, чтобы определить, что вам нравится.

person camickr    schedule 17.03.2011
comment
Метод задержки усыпляет робота. Как это замедлит движение мыши? Или вы имеете в виду, что я должен создать свой собственный алгоритм, который перемещает мышь пиксель за пикселем с определенным шагом? - person Tom; 17.03.2011
comment
Да, вам нужно создать цикл, который перемещает мышь на пиксель (или два), а затем задерживается перед переходом к следующему пикселю. Вот почему вы можете создать свой собственный алгоритм. Вы определяете, на сколько пикселей переместить и на какое время откладывать и т. Д. - person camickr; 17.03.2011
comment
это не дает ответа на вопрос, какой алгоритм был бы гуманным. - person Tom; 17.03.2011
comment
Что вы от нас ждете? Я не разбираюсь в том, что было бы гуманно. Вот почему я предложил вам самому попробовать пару алгоритмов, чтобы увидеть, что вам нравится :) Если вы хотите, вы можете даже опубликовать код, который позволяет людям опробовать ваш код с различными алгоритмами, и люди могут голосовать за то, что им нравится. - person camickr; 17.03.2011

Вот довольно хороший способ:

Примите во внимание start_x, где ваша мышь начинается, и end_x, где вы хотите, чтобы она закончилась. То же самое для y

for (int i=0; i<100; i++){  
    int mov_x = ((end_x * i)/100) + (start_x*(100-i)/100);
    int mov_y = ((end_y * i)/100) + (start_y*(100-i)/100);
    robot.mouseMove(mov_x,mov_y);
    robot.delay(10);
}

Надеюсь, это поможет...

person Geoff    schedule 27.05.2011
comment
Вынос деления из круглых скобок делает его немного быстрее и точнее. Вышеупомянутый алгоритм, записанный как есть, перемещается от (1, 1) к (1, 1) через (0, 0). Еще одна проблема: он проходит только 99% пути. - person maaartinus; 04.11.2011

Перепишите ответ Джеффа для облегчения понимания:

for (int i=0; i<=100; i++){
   int mov_x = start_x + (end_x - start_x) * i/100;
   int mov_y = start_y + (end_y - start_y) * i/100;
   robot.mouseMove(mov_x,mov_y);
   robot.delay(10);
}
person hthhth    schedule 22.02.2021