Comment simuler un événement tactile avec Android tout en donnant les coordonnées X et Y manuellement?
Comment simuler un événement tactile avec Android tout en donnant les coordonnées X et Y manuellement?
Réponses:
La méthode de Valentin Rocher fonctionne si vous avez étendu votre vue, mais si vous utilisez un écouteur d'événements, utilisez ceci:
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);
Pour en savoir plus sur l'obtention d'un objet MotionEvent, voici une excellente réponse: Android: Comment créer un MotionEvent?
downTime
serait le moment où l'utilisateur touche l'écran vers le bas, alors que eventTime
dans ce cas, ce serait le moment où l'utilisateur lève le doigt ( ACTION_UP
). Je ne sais pas si cela fonctionnera toujours si les deux sont identiques. Vous pouvez le tester et publier vos résultats.
Voici un script monkeyrunner qui envoie des touches et des traînées à une application. J'utilise ceci pour tester que mon application peut gérer des gestes rapides et répétitifs.
# 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
place de 'DOWN_AND_UP'
. ( DOWN_AND_UP
est la valeur par défaut, donc votre code fonctionne toujours)
UP
action
utiliser les commandes adb Shell pour simuler l'événement tactile
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
Si je comprends bien, vous voulez le faire par programme. Ensuite, vous pouvez utiliser la méthode onTouchEvent de View
et créer un MotionEvent
avec les coordonnées dont vous avez besoin.
Vous devriez essayer le nouveau monkeyrunner . Cela peut peut-être résoudre vos problèmes. Vous y mettez des codes clés pour les tests, peut-être que des événements tactiles sont également possibles.
adb shell monkey
le cas monkeyrunner
, qui est un outil différent.
Lors de l'utilisation de Monkey Script, j'ai remarqué que DispatchPress (KEYCODE_BACK) ne faisait rien de vraiment nul. Dans de nombreux cas, cela est dû au fait que l'activité ne consomme pas l'événement Key. La solution à ce problème consiste à utiliser un mélange de script monkey et de commande d'entrée du shell adb dans une séquence.
1 L'utilisation du script monkey a donné un excellent contrôle de la synchronisation. Attendez un certain nombre de secondes pour l'activité et c'est un appel adb bloquant.
2 Enfin, l'envoi de keyevent d'entrée du shell adb mettra fin à l'APK en cours d'exécution.
PAR EXEMPLE
adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
entrée du shell adb keyevent 4