¿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?
downTimesería el momento en el que el usuario toca la pantalla, mientras que eventTimeen 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_UPlugar de 'DOWN_AND_UP'. ( DOWN_AND_UPes el predeterminado, por lo que su código aún funciona)
UPacció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 Viewy crear un MotionEventcon 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