Come simulare un evento touch con Android fornendo manualmente le coordinate X e Y?
Come simulare un evento touch con Android fornendo manualmente le coordinate X e Y?
Risposte:
Il metodo di Valentin Rocher funziona se hai esteso la tua vista, ma se stai usando un listener di eventi, usa questo:
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);
Per ulteriori informazioni su come ottenere un oggetto MotionEvent, ecco un'eccellente risposta: Android: come creare un MotionEvent?
downTime
sarebbe il momento in cui l'utente tocca lo schermo, mentre eventTime
in questo caso sarebbe il momento in cui l'utente solleva il dito ( ACTION_UP
). Non sono sicuro se funzionerà ancora se entrambi sono uguali. Potresti testarlo e pubblicare i tuoi risultati.
Ecco uno script monkeyrunner che invia il tocco e trascina a un'applicazione. L'ho usato per verificare che la mia applicazione sia in grado di gestire gesti rapidi e ripetitivi di scorrimento.
# 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
invece di 'DOWN_AND_UP'
. ( DOWN_AND_UP
è l'impostazione predefinita, quindi il codice funziona ancora)
UP
azione
utilizzare i comandi della shell adb per simulare l'evento touch
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
Se ho capito chiaramente, vuoi farlo in modo programmatico. Quindi, puoi usare il metodo onTouchEvent di View
e creare un MotionEvent
con le coordinate che ti servono.
Dovresti provare il nuovo monkeyrunner . Forse questo può risolvere i tuoi problemi. Ci metti dei codici chiave per il test, forse sono possibili anche eventi di tocco.
adb shell monkey
il monkeyrunner
, che è uno strumento diverso.
Quando si utilizza Monkey Script, ho notato che DispatchPress (KEYCODE_BACK) non fa nulla che faccia davvero schifo. In molti casi ciò è dovuto al fatto che l'attività non consuma l'evento chiave. La soluzione a questo problema è usare una combinazione di monkey script e comando di input della shell adb in una sequenza.
1 L'utilizzo di monkey script ha dato un ottimo controllo del tempo. Attendi una certa quantità di secondo per l'attività ed è una chiamata adb di blocco.
2 Infine, l'invio di adb shell input keyevent 4 terminerà l'esecuzione dell'APK.
PER ESEMPIO
adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb shell input keyevent 4