Creazione di una funzione di trascinamento del mouse migliore

2

Originariamente avevo postato questo articolo per la revisione del codice, non sapendo che il codice incompleto era off-topic ed era indirizzato a postare qui. Non credo che questa domanda sia adatta allo stack overflow perché il codice che attualmente ho funziona, non sono contento.

Sto creando una classe java per automatizzare semplici attività sul mio computer. La classe java.awt.Robot contiene già la maggior parte delle funzioni di cui ho bisogno . La sua funzione mouseMove sposta il mouse istantaneamente in un punto, ma dal momento che un essere umano non si sposta istantaneamente su un punto, ho creato una funzione che trascinerà il mio mouse tra due punti per un periodo di tempo.

La mia funzione è fissata per iterare al 1/30 di secondo. Ho usato l'equazione Velocity = Distance / Time per ottenere quanto il mouse dovrebbe spostare ogni iterazione e ho usato la funzione mouseMove del robot per muovere effettivamente il mouse.

Ho due problemi con la mia funzione:

  1. Un umano non si sposta su un punto in linea retta, di solito si curva in un arco positivo indipendentemente dalla direzione. Non sono sicuro su come dovrei cambiare il mio algoritmo per implementarlo.

  2. Ho usato Thread.sleep (33) per ottenere circa 1 / 30esimo tempo di iterazione per il ciclo for, e moltiplicato il tempo per 30 per ottenere la quantità corretta di iterazioni. Sto sprecando CPU dormendo e preferisco non dormire affatto, ma non sono sicuro di come calcolare il tempo poiché il ciclo può andare a qualsiasi velocità voglia.

    package com;
    import java.awt.AWTException;
    import java.awt.Point;
    import java.awt.Robot;
    
    public class Tools {
        private Robot robot;
    
        public Tools() {
            try {
                robot = new Robot();
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
    
        //assumes the for loop will iterate at 30th of a second for an accurate time
        public void drag (Point p1, Point p2, double time) {
            try {
                //t = time * 30 to get correct amount of iterations
                for (long t = (long)(time * 30); t > 0; t--) {
                    p1.x += (p2.x - p1.x) / t;
                    p1.y += (p2.y - p1.y) / t;
                    robot.mouseMove(p1.x, p1.y);
                    //sleep to maintain 1/30th of a second iteration
                    Thread.sleep(33);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } 
        }
    }
    
posta anonamousUsername 16.09.2015 - 00:29
fonte

0 risposte

Leggi altre domande sui tag