2012-02-22 164 views
2

有一個mouseMove()方法使指針跳轉到該位置。我希望能夠讓鼠標在整個屏幕上平滑移動。我需要編寫一個名爲mouseGLide()的方法,該方法需要一個開始x,開始y,結束x,結束y,滑行所需的總時間以及在滑行過程中要執行的步驟數。它應該通過從n步開始(start x,start y)到(end x,start y)來設置鼠標指針的動畫。總滑翔應該花費t毫秒。如何通過使用java在整個屏幕上平滑移動鼠標?

我不知道如何開始任何人都可以幫助我開始這個?任何人都可以告訴我,爲了解決這個問題,我需要採取哪些措施。

回答

21

首先,讓我們寫出一個空白方法,其中參數與您在問題中定義的相同。

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代表你的鼠標的x差分座標每次它同時滑翔運動。基本上它是總移動距離分爲n步驟。除了y座標外,與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(); 
    } 
} 
+0

謝謝您的回答!雖然它沒有被提問者接受,但它確實幫助了我:-)但是你基本上可以擺脫睡眠延遲,因爲如果反正有很多步驟它會變得非常慢。 – moeTi 2012-05-07 08:48:21

+0

一個改進就是測量喚醒和移動需要多長時間,然後爲(dt - timeSinceLastMove)而不是總是使用dt睡眠(這需要在睡眠之前進行移動,並且可能從第0步開始)步驟1)。 – tucuxi 2012-08-03 07:43:43

相關問題