104

X座標とY座標を手動で指定しながら、Androidでタッチイベントをシミュレートする方法は?

4

7 に答える 7

113

ビューを拡張した場合は Valentin Rocher の方法が機能しますが、イベント リスナーを使用している場合は、次のようにします。

view.setOnTouchListener(new OnTouchListener()
{
    public boolean onTouch(View v, MotionEvent event)
    {
        Toast toast = Toast.makeText(
            getApplicationContext(), 
            "View touched", 
            Toast.LENGTH_LONG
        );
        toast.show();

        return true;
    }
});


// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
float x = 0.0f;
float y = 0.0f;
// List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
int metaState = 0;
MotionEvent motionEvent = MotionEvent.obtain(
    downTime, 
    eventTime, 
    MotionEvent.ACTION_UP, 
    x, 
    y, 
    metaState
);

// Dispatch touch event to view
view.dispatchTouchEvent(motionEvent);

MotionEvent オブジェクトの取得について詳しくは、次の優れた回答をご覧ください: Android: How to create a MotionEvent?

于 2011-08-09T18:52:05.417 に答える
24

これは、タッチとドラッグをアプリケーションに送信する monkeyrunner スクリプトです。これを使用して、アプリケーションが迅速な反復スワイプ ジェスチャを処理できることをテストしています。

# This is a monkeyrunner jython script that opens a connection to an Android
# device and continually sends a stream of swipe and touch gestures.
#
# See http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html
#
# usage: monkeyrunner swipe_monkey.py
#

# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device
device = MonkeyRunner.waitForConnection()

# A swipe left from (x1, y) to (x2, y) in 2 steps
y = 400
x1 = 100
x2 = 300
start = (x1, y)
end = (x2, y)
duration = 0.2
steps = 2
pause = 0.2

for i in range(1, 250):
    # Every so often inject a touch to spice things up!
    if i % 9 == 0:
        device.touch(x2, y, 'DOWN_AND_UP')
        MonkeyRunner.sleep(pause)
    # Swipe right
    device.drag(start, end, duration, steps)
    MonkeyRunner.sleep(pause)
    # Swipe left
    device.drag(end, start, duration, steps)
    MonkeyRunner.sleep(pause)
于 2011-01-19T00:13:02.337 に答える
1

新しいモンキーランナーを試してみてください。多分これはあなたの問題を解決することができます。テスト用にキーコードを入れます。おそらくタッチイベントも可能です。

于 2010-12-09T08:10:31.810 に答える
1

私が明確に理解している場合、あなたはこれをプログラムで行いたいと考えています。次に、 のonTouchEventメソッドを使用して、必要な座標でViewを作成できます。MotionEvent

于 2010-12-09T08:11:49.360 に答える
0

Monkey Script を使用しているとき、 DispatchPress(KEYCODE_BACK) が何もしていないことに気付きました。多くの場合、これはアクティビティが Key イベントを消費しないことが原因です。この問題の解決策は、monkey スクリプトと adb シェル入力コマンドを組み合わせて使用​​することです。

1 モンキー スクリプトを使用すると、優れたタイミング制御が可能になりました。アクティビティを一定時間待機し、adb 呼び出しをブロックします。
2 最後に adb shell input keyevent 4 を送信すると、実行中の APK が終了します。

例えば

adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb shell input keyevent 4

于 2013-01-25T04:25:49.307 に答える
-6

MotionEvent は、画面に触れるだけで生成されます。

于 2010-12-10T04:18:33.123 に答える