Я могу просто имитировать одиночные касания - касание, смахивание, удержание и т. Д. В моих тестах, но полностью застрял в имитации multi touch на HTС 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]
Вот моя проблема:
Как я могу сгенерировать события с 4 координатами (pid 0 x0 y0 и pid 1 x1 y1)?
Похоже, мне нужно найти способ использования следующего события:
общедоступное статическое событие MotionEvent получить (long downTime, long eventTime, int действие, указатели int, 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
Моя проблема в том, что я не могу сгенерировать 2 пары координат для указателя 0 и указателя 1:
(14368): event ACTION_POINTER_DOWN(pid 1)[#0(pid 0)=138,189]
Здесь вы можете видите, что, используя вашу логику, я добавил к событию pid1, но у него все еще нет координат, потому что x и y были связаны с pid 0 ..
Заранее спасибо.
Yahor
Еще есть нет идей, как это реализовать, отправлял ли кто-нибудь событие мультитач?