Comment simuler un événement tactile sur Android?

comment simuler un événement tactile avec Android tout en donnant les coordonnées X et Y manuellement?

91
demandé sur Harikrishnan 2010-12-09 10:59:25

7 réponses

la méthode de Valentin Rocher fonctionne si vous avez étendu votre vue, mais si vous utilisez un écouteur d'événement, 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?

102
répondu azdev 2017-05-23 12:03:08

voici un script monkeyrunner qui envoie touch and drags à une application. J'ai utilisé ceci pour tester que mon application peut supporter 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)
22
répondu Warwick 2011-01-19 00:13:02

utiliser des commandes Shell adb pour simuler l'événement

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 
19
répondu Arjun Prakash 2018-01-03 07:51:45

si je comprends bien, vous voulez le faire programmatiquement. Ensuite , vous pouvez utiliser la onTouchEvent méthode de View , et créer un MotionEvent avec les coordonnées dont vous avez besoin.

1
répondu Valentin Rocher 2010-12-09 08:11:49

vous devriez donner le nouveau monkeyrunner un go. Peut-être que ça peut résoudre tes problèmes. Vous y mettez des keycodes pour tester, peut-être que les événements tactiles sont aussi possibles.

1
répondu keyboardsurfer 2016-10-06 07:30:19

en utilisant le script Monkey j'ai remarqué que DispatchPress (KEYCODE_BACK) ne fait rien qui craint vraiment. Dans de nombreux cas, cela est dû au fait que l'activité ne consomme pas l'événement clé. La solution à ce problème est d'utiliser un mélange de script singe et commande d'entrée de shell de la BAD dans une séquence.

1 en utilisant l'écriture de singe a donné un bon timing contrôle. Attendre une certaine quantité de seconde pour l'activité et est un le blocage de la bad appel.

Deux Enfin, envoyer adb shell input keyevent 4 mettra fin à L'APK en cours d'exécution.

EG

adb shell monkey-P com.mon Dieu.application-v-v-v-f /sdcard/monkey_script.txt 1

la commande adb shell entrée keyevent 4

0
répondu Thomas J Younsi 2013-01-25 05:33:15

MotionEvent n'est généré qu'en touchant l'écran.

-6
répondu indira 2010-12-10 04:18:33