Как смоделировать сенсорное событие в Android? - PullRequest
94 голосов
/ 09 декабря 2010

Как смоделировать сенсорное событие с Android, задавая координаты X и Y вручную?

Ответы [ 7 ]

105 голосов
/ 09 августа 2011

Метод Валентина Роше работает, если вы расширили свое представление, но если вы используете прослушиватель событий, используйте это:

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);

Подробнее о получении объекта MotionEvent можно найти здесь: Android: как создать MotionEvent?

22 голосов
/ 19 января 2011

Вот скрипт monkeyrunner, который отправляет прикосновения и перетаскивает в приложение.Я использовал это, чтобы проверить, что мое приложение может обрабатывать быстрые повторяющиеся жесты.

# 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)
20 голосов
/ 12 марта 2014

использовать команды оболочки adb для имитации события касания

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 
1 голос
/ 09 декабря 2010

Если я правильно понимаю, вы хотите сделать это программно.Затем вы можете использовать onTouchEvent метод View и создать MotionEvent с нужными вам координатами.

1 голос
/ 09 декабря 2010

Вы должны дать новому monkeyrunner шанс.Может быть, это может решить ваши проблемы.Вы добавили в него коды клавиш для тестирования, возможно, сенсорные события также возможны.

0 голосов
/ 25 января 2013

При использовании Monkey Script я заметил, что DispatchPress (KEYCODE_BACK) не делает ничего, что действительно отстой.Во многих случаях это связано с тем, что Activity не использует событие Key.Решение этой проблемы состоит в том, чтобы использовать последовательность сценариев обезьяны и команды ввода оболочки adb в определенной последовательности.

1 Использование скрипта обезьяны дало отличный контроль времени.Подождите определенное количество секунд для активности, и это блокирующий вызов adb.
2 Наконец, отправка ввода ключа оболочки adb 4 завершит работу APK.

EG

adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
ввод ключа оболочки adb 4

0 голосов
/ 10 декабря 2010

MotionEvent генерируется только при касании экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...