4

ポインタをその場所にジャンプさせる mouseMove() メソッドがあります。画面全体でマウスをスムーズに動かせるようにしたい。開始 x、開始 y、終了 x、終了 y、グライドにかかる合計時間、およびグライド中に作成するステップ数を受け取る、mouseGLide() という名前のメソッドを作成する必要があります。(開始 x、開始 y) から (終了 x、開始 y) まで n ステップで移動することにより、マウス ポインターをアニメーション化する必要があります。グライドの合計には t ミリ秒かかります。

どうやって始めたらいいのかわからない 誰か助けてくれませんか?この問題を解決するために必要な手順を教えてください。

4

3 に答える 3

28

まず、質問で定義したとおりのパラメーターを持つ空のメソッドを書き出しましょう。

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です。dyy座標以外は同じです。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();
    }
}
于 2012-02-22T01:07:53.367 に答える
0

いいえを使用します。ステップの数は、すべての状況で理想的であるとは限りません。以下は、マウスを特定のピクセル量だけ移動するコードです。

このロジックの考え方は、開始点と終了点を提供し、次のことを行います。

  • 2点の直線方程式を取得します
  • 線に沿ってポイント(ピクセルジャンプ)を識別します
  • 一般的なマウスの動きを再現するために、非常に最小限の遅延を使用して、線上の特定された各ポイントにマウスを移動します。
/**
 * 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);
}
于 2021-12-08T05:15:44.377 に答える