Тестирование Android, как имитировать мультитач (увеличение / уменьшение) с помощью инструментов? - PullRequest
11 голосов
/ 03 марта 2011

Я могу просто имитировать отдельные касания - касание, пролистывание, удержание и т. Д. В моих тестах, но полностью застрял с симуляцией мультитача на HTC Desire с Android 2.2.

Не могли бы вы посоветовать, как я могу воспроизводить событияцепочка для тестирования мультитач?

Я думаю, что мне нужно использовать какой-нибудь хитрый тип MotionEvent, такой как MASK или что-то вроде этого, но я не знаю, как это сделать.

Я нашел здесьдамп событий воспроизводимого масштабирования: http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2-part-3-understanding-touch-events/1775?tag=mantle_skin;content

 1. event ACTION_DOWN[#0(pid 0)=135,179]
 2. event ACTION_MOVE[#0(pid 0)=135,184]
 3. event ACTION_MOVE[#0(pid 0)=144,205]
 4. event ACTION_MOVE[#0(pid 0)=152,227]
 5. event ACTION_POINTER_DOWN(pid 1)[#0(pid 0)=153,230;#1(pid 1)=380,538]
 6. event ACTION_MOVE[#0(pid 0)=153,231;#1(pid 1)=380,538]
 7. event ACTION_MOVE[#0(pid 0)=155,236;#1(pid 1)=364,512]
 8. event ACTION_MOVE[#0(pid 0)=157,240;#1(pid 1)=350,498]
 9. event ACTION_MOVE[#0(pid 0)=158,245;#1(pid 1)=343,494]
 10. event ACTION_POINTER_UP(pid 0)[#0(pid 0)=158,247;#1(pid 1)=336,484]
 11. event ACTION_MOVE[#0(pid 1)=334,481]
 12. event ACTION_MOVE[#0(pid 1)=328,472]
 13. event ACTION_UP[#0(pid 1)=327,471]

Вот моя проблема:

событие ACTION_POINTER_DOWN (pid 1) [# 0 (pid 0) = 153 230; # 1 (pid 1) = 380 538] событие ACTION_MOVE [# 0 ** (pid 0) = 153 231 **;# 1 ** (pid 1) = 380,538 **]

Как генерировать события с 4 координатами (pid 0 x0 y0 и pid 1 x1 y1)?

ПохожеМне нужно найти способ, как использовать следующее событие:

public static MotionEvent get (long downTime, long eventTime, int action, int pointers, int [] pointerIds, PointerCoords [] pointerCoords, int metaState, float xPrecision, float yPrecision, int deviceId, int edgeFlags, int source, int flags)

Спасибо Дэну за ответ, я попробовал эту логику, но все еще сталкиваюсь с проблемами при добавлении координат:

MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, 135, 179, 0);
            inst.sendPointerSync(event);
//                eventTime+=100;
            event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, 135, 184, 0);
            inst.sendPointerSync(event);
//                eventTime+=100;

            int pointerToMove = 1; // pointer IDs are zero-based
            event = MotionEvent.obtain(downTime, eventTime, (pointerToMove << MotionEvent.ACTION_POINTER_INDEX_SHIFT) +  MotionEvent.ACTION_POINTER_DOWN, 138, 189, 0);
            inst.sendPointerSync(event);


            event = MotionEvent.obtain(downTime, eventTime, (pointerToMove << MotionEvent.ACTION_POINTER_INDEX_SHIFT) + MotionEvent.ACTION_MOVE, 158, 220, 0);
            inst.sendPointerSync(event);

 //                eventTime+=100;
            event = MotionEvent.obtain(downTime, eventTime, (2 * 256) + MotionEvent.ACTION_MOVE, 138, 180, 0);
            inst.sendPointerSync(event);
 //                eventTime+=100;
            event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE,  135, 184, 0);

Эта последовательность событий перехватывается в моей тестовой заглушке и выводится как:

(14368): event ACTION_DOWN[#0(pid 0)=135,179]
(14368): event ACTION_MOVE[#0(pid 0)=135,184]
(14368): event ACTION_POINTER_DOWN(pid 1)[#0(pid 0)=138,189]
(14368): event ACTION_MOVE[#0(pid 0)=158,220]
(14368): event ACTION_MOVE[#0(pid 0)=138,180]
(14368): event ACTION_MOVE[#0(pid 0)=135,184]

Здесь вы можете видеть, что (2 * 256) + MotionEvent.ACTION_MOVE не изменяет идентификатор указателя для события :( ИpointerToMove << Подход MotionEvent.ACTION_POINTER_INDEX_SHIFT не работает для ACTION_POINTER_DOWN, может быть, я не могу использовать такой способ для POINTER_DOWN? </p>

Моя проблема в том, что я не могу сгенерировать 2 пары координат для Pointer 0 и Pointer 1:

(14368): event ACTION_POINTER_DOWN(pid 1)[#0(pid 0)=138,189]

Здесь вы можете видеть, что, используя вашу логику, я добавил pid1 к событию, но он все еще не имеет координат, потому что x и y были связаны с pid 0 ..

Заранее спасибо.

Яхор

Все еще не знаете, как его реализовать, кто-нибудь когда-нибудь отправлял мультитач событие?

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Полагаю, вам просто нужно указать индекс указателя в параметре 'action', переданном в MotionEvent.obtain. В частности, старшие 8 битов действия являются индексом указателя, а нижние 8 битов являются действием (например, MotionEvent.ACTION_MOVE). Итак, если вы хотите переместить второй указатель, это должно сработать:

int pointerToMove = 1; // pointer IDs are zero-based
event = MotionEvent.obtain(downTime, eventTime, (pointerToMove << MotionEvent.ACTION_POINTER_INDEX_SHIFT) + MotionEvent.ACTION_MOVE, x0, y0, 0);
inst.sendPointerSync(event);

* Дан 1004 *

0 голосов
/ 13 мая 2011

Я предположил , что может помочь вам ..

...