¿Cómo simular un evento táctil con Android mientras se dan las coordenadas X e Y manualmente?
¿Cómo simular un evento táctil con Android mientras se dan las coordenadas X e Y manualmente?
Respuestas:
El método de Valentin Rocher funciona si ha ampliado su vista, pero si está utilizando un detector de eventos, utilice 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 cómo obtener un objeto MotionEvent, aquí hay una excelente respuesta: Android: ¿Cómo crear un MotionEvent?
downTime
sería el momento en el que el usuario toca la pantalla, mientras que eventTime
en este caso sería cuando el usuario levanta el dedo ( ACTION_UP
). No estoy seguro de si funcionará si ambos son iguales. Puede probarlo y publicar sus resultados.
Aquí hay un script de monkeyrunner que envía touch y arrastra a una aplicación. He estado usando esto para probar que mi aplicación puede manejar gestos de deslizamiento rápidos y repetitivos.
# 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
lugar de 'DOWN_AND_UP'
. ( DOWN_AND_UP
es el predeterminado, por lo que su código aún funciona)
UP
acción
use 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
Si lo entiendo claramente, quieres hacer esto programáticamente. Luego, puede usar el método onTouchEvent de View
y crear un MotionEvent
con las coordenadas que necesita.
Deberías darle una oportunidad al nuevo monkeyrunner . Quizás esto pueda resolver tus problemas. Pones códigos de tecla para probar, tal vez también sean posibles los eventos táctiles.
adb shell monkey
, es el monkeyrunner
, que es una herramienta diferente.
Al usar Monkey Script, noté que DispatchPress (KEYCODE_BACK) no hace nada que realmente apesta. En muchos casos, esto se debe al hecho de que la actividad no consume el evento clave. La solución a este problema es utilizar una combinación de script mono y comando de entrada de shell adb en una secuencia.
1 El uso de la escritura mono dio un gran control del tiempo. Espere una cierta cantidad de segundos para la actividad y es una llamada adb de bloqueo.
2 Finalmente, el envío de adb shell input keyevent 4 finalizará la ejecución del APK.
P.EJ
adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb shell input keyevent 4