X座標とY座標を手動で指定しながらAndroidでタッチイベントをシミュレートする方法は?
X座標とY座標を手動で指定しながらAndroidでタッチイベントをシミュレートする方法は?
回答:
ビューを拡張した場合は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:MotionEventを作成する方法は?
downTime
ユーザーが画面をタッチダウンするときですが、eventTime
この場合、ユーザーが指を離すとき(ACTION_UP
)になります。両方が同じ場合でも機能するかどうかはわかりません。テストして結果を投稿できます。
以下は、タッチとドラッグをアプリケーションに送信する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)
MonkeyDevice.DOWN_AND_UP
代わりに使用する必要があります'DOWN_AND_UP'
。(これDOWN_AND_UP
がデフォルトなので、コードは引き続き機能します)
UP
アクションの直後に再起動しました
adbシェルコマンドを使用してタッチイベントをシミュレートする
adb shell input tap x y
and also
adb shell sendevent /dev/input/event0 3 0 5
adb shell sendevent /dev/input/event0 3 1 29
私が明確に理解している場合は、これをプログラムで実行する必要があります。次に、のonTouchEventメソッドを使用して、必要な座標でをView
作成MotionEvent
できます。
新しいmonkeyrunnerを試してみてください。多分これはあなたの問題を解決することができます。テスト用にキーコードを入れます。おそらくタッチイベントも可能です。
adb shell monkey
ではありませんmonkeyrunner
。
モンキースクリプトを使用しているときに、DispatchPress(KEYCODE_BACK)が実際には何も実行していないことに気付きました。多くの場合、これはアクティビティがキーイベントを消費しないためです。この問題の解決策は、猿のスクリプトと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