studio - ¿Cómo simular un evento táctil en Android?
manual de programacion android pdf (7)
¿Cómo simular un evento táctil con Android mientras se dan las coordenadas X e Y manualmente?
Aquí hay una secuencia de comandos monkeyrunner que envía toques y arrastra a una aplicación. He estado usando esto para probar que mi aplicación puede manejar gestos rápidos de barrido repetitivo.
# 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)
Cuando uso Monkey Script noté que DispatchPress (KEYCODE_BACK) no está haciendo nada que realmente apesta. En muchos casos, esto se debe a que la Actividad no consume el evento clave. La solución a este problema es usar una combinación de script mono y comando de entrada de shell adb en una secuencia.
1 El uso de la secuencia de comandos mono dio un gran control de tiempo. Espere una cierta cantidad de segundos para la actividad y es una llamada adb de bloqueo.
2 Finalmente, el envío de la entrada del shell adb keyevent 4 finalizará la APK en ejecución.
P.EJ
adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
entrada de shell adb keyevent 4
Deberías darle una monkeyrunner al nuevo monkeyrunner . Quizás esto puede resolver tus problemas. Le pones códigos clave para probar, tal vez los eventos táctiles también son posibles.
El método de Valentin Rocher funciona si extendió su vista, pero si está usando un detector de eventos, use esto:
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);
Para obtener más información sobre la obtención de un objeto MotionEvent, aquí hay una respuesta excelente: Android: ¿Cómo crear un MotionEvent?
MotionEvent se genera solo tocando la pantalla.
Si entiendo claramente, quieres hacer esto programáticamente. Luego, podría usar el método onTouchEvent de View
y crear un MotionEvent
con las coordenadas que necesita.
utilice adb Shell Commands para simular el evento táctil
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