2013-05-18 4 views
1

Мне нужно смоделировать мультитач-события (масштабирование, панорамирование и т. Д.) Для использования в инструментальных тестах приложения для Android. Одним из способов было бы вручную создать соответствующую последовательность MotionEvent s, имитирующую реальный ввод, а затем отправьте их по одному. Прежде чем я это сделаю, есть ли какой-нибудь хороший API, который делает такое симуляцию? Я думаю, что многие люди столкнулись с этой проблемой в прошлом. Я смотрел на Robotium Solo, но он только обеспечивает touch/drag для одного указателя.Имитировать событие Multitouch в Android Программно для тестирования

Если такого API нет, то как лучше всего подойти к проблеме? Я думал написать функцию, которая принимает пару точек (начало, конец) и продолжительность для каждого участвующего указателя, но это ограничивало бы движения движением линейного указателя.

public void twoFingerTouchEvent(
      Point from1, Point to1, int duration1, 
      Point from2, Point to2, int duration2) { 

    if (from1.equals(to1) && from2.equals(to2)) { 
    // two pointer tap 
    // DISPATCH_DOWN 
    // DISPATCH_POINTER_DOWN 
    // WAIT min(duration1, duration2) 
    // DISPATCH_POINTER_UP 
    // WAIT abs(duration1 - duration2) 
    // DISPATCH_UP 
    } 
    else if (from1.equals(to1) || from2.equals(to2)) { 
    // one of two pointers dragged after tap 
    // DISPATCH_DOWN 
    // DISPATCH_POINTER_DOWN 
    // DISPATCH_MOVE for moving pointer every 3-5 pixels, account for duration 
    // DISPATCH_POINTER_UP 
    // DISPATCH_UP 
    } 
    else { 
    // two pointer drag 
    // DISPATCH_DOWN 
    // DISPATCH_POINTER_DOWN 
    // DISPATCH_MOVE for both pointers in alternating order every 3-5 pixels 
    // DISPATCH_POINTER_UP 
    // DISPATCH_MOVE for pointer with longer duration 
    // DISPATCH_UP 
    } 
} 

ответ

0

Вы должны использовать MotionEvent#obtain - он может быть использован для создания MotionEvent, содержащую несколько указателей. Вы не ограничены движением линейного указателя - вы можете передать массив точек и выполнить одно действие вниз, затем x раз перемещение действия и, наконец, действие вверх.

+0

Спасибо за ответ! Вы знаете, как имитировать мультитач для API <9? Этот метод, по-видимому, принимает pointerCount, но только координаты одного указателя. Поэтому я не уверен, как использовать его для получения необходимых событий: Представлено в API 5: public static MotionEvent get (long downTime, long eventTime, int action, int pointerCount, float x, float y, float pressure, float size, int metaState, float xPrecision, float yPrecision, int deviceId, int edgeFlags) – zavidovych

0

Принимая из документации для MotionEvent:

Для API 9 и ниже, вы хотите использовать MotionEvent.ACTION_POINTER_X_DOWN/UP, чтобы указать, какой указатель вверх или вниз.

Последовательность событий - это ACTION_DOWN для первого контакта, за которым следуют ACTION_POINTER_X_DOWN или ACTION_POINTER_X_UP, когда новые контакты добавляются или удаляются, пока вы, наконец, не получите последнее событие ACTION_UP, чтобы «поднять» последний контакт.

 
(actionId, pointerCount) 
ACTION_DOWN, 1 // initial contact 
ACTION_POINTER_2_DOWN, 2 
ACTION_MOVE, 2 // generate a two-touch drag/zoom event 
ACTION_POINTER_2_UP, 2 
ACTION_UP, 1 

я основывал из этого SO сообщения: How to generate zoom/pinch gesture for testing for Android

Смежные вопросы