Wie simuliere ich ein Touch-Ereignis mit Android, während ich die X- und Y-Koordinaten manuell gebe?
Wie simuliere ich ein Touch-Ereignis mit Android, während ich die X- und Y-Koordinaten manuell gebe?
Antworten:
Die Methode von Valentin Rocher funktioniert, wenn Sie Ihre Ansicht erweitert haben. Wenn Sie jedoch einen Ereignis-Listener verwenden, verwenden Sie Folgendes:
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);
Weitere Informationen zum Abrufen eines MotionEvent-Objekts finden Sie hier: Android: Wie erstelle ich ein MotionEvent?
downTimeist die Zeit, in der der Benutzer auf dem Bildschirm aufsetzt, während eventTimein diesem Fall der Benutzer seinen Finger nach oben hebt ( ACTION_UP). Ich bin nicht sicher, ob es noch funktionieren wird, wenn beide gleich sind. Sie können es testen und Ihre Ergebnisse veröffentlichen.
Hier ist ein Monkeyrunner-Skript, das Berührungen sendet und an eine Anwendung zieht. Ich habe dies verwendet, um zu testen, ob meine Anwendung schnelle, sich wiederholende Wischgesten verarbeiten kann.
# 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_UPanstelle von verwenden 'DOWN_AND_UP'. ( DOWN_AND_UPist die Standardeinstellung, damit Ihr Code immer noch funktioniert)
UPAktion neu
Verwenden Sie adb Shell-Befehle, um das Berührungsereignis zu simulieren
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
Wenn ich das klar verstehe, möchten Sie dies programmatisch tun. Anschließend können Sie die onTouchEvent- Methode von verwenden Viewund eine MotionEventmit den von Ihnen benötigten Koordinaten erstellen .
Sie sollten den neuen Monkeyrunner ausprobieren . Vielleicht kann dies Ihre Probleme lösen. Sie geben zum Testen Schlüsselcodes ein, möglicherweise sind auch Berührungsereignisse möglich.
adb shell monkeydas monkeyrunner, was ein anderes Werkzeug ist.
Bei der Verwendung von Monkey Script ist mir aufgefallen, dass DispatchPress (KEYCODE_BACK) nichts tut, was wirklich scheiße ist. In vielen Fällen liegt dies daran, dass die Aktivität das Schlüsselereignis nicht verwendet. Die Lösung für dieses Problem besteht darin, eine Mischung aus Monkey-Skript und ADB-Shell-Eingabebefehl in einer Sequenz zu verwenden.
1 Die Verwendung des Affenskripts ermöglichte eine hervorragende Zeitsteuerung. Warten Sie eine bestimmte Sekunde auf die Aktivität und es handelt sich um einen blockierenden AdB-Aufruf.
2 Wenn Sie schließlich den Eingabeschlüssel-Eingabeschlüsselereignis 4 senden, wird die laufende APK beendet.
Z.B
adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb shell input keyevent 4