2011-03-03 15 views
11

Simplemente puedo simular toques simples: tocar, deslizar, sostener etc. en mis pruebas, pero completamente atorado con la simulación de multitáctil en HTDesire con Android 2.2.pruebas de Android, cómo simular multitouch (acercar/alejar) usando instrumentos?

¿Podría aconsejarnos, cómo puedo reproducir la cadena de eventos para probar toques múltiples?

Creo que necesito usar algún tipo de Motionwise complicado como MASK o algo así, pero no tengo ni idea de cómo hacerlo.

he encontrado aquí un vertedero de eventos de zoom reproducido: 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] 

Aquí está mi problema:

  1. caso ACTION_POINTER_DOWN (pid 1) [ # 0 (pid 0) = 153,230; # 1 (pid 1) = 380,538]
  2. evento ACTION_MOVE [# 0 ** (pid 0) = 153,231 **; # 1 ** (pid 1) = 380,538 **]

¿Cómo puedo generar eventos con 4 coordenadas (pid 0 x0 y0 y pid 1 x1 y1)?

Parece que tengo que encontrar la manera de cómo utilizar suceso siguiente:

MotionEvent public static obtener (largo tiempo de inactividad, tiempo eventTime, la acción int, punteros, int [] pointerIds, PointerCoords [] pointerCoords, int metaState, flotar xPrecision, flotar yPrecision, int deviceId, int edgeFlags, int fuente, int flags)

Gracias a Dan como respuesta, he tratado de esta lógica, pero todavía encontrar problemas para agregar coordenadas:

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

Estos eventos secuencia son capturados en mi talón de prueba y arrojó como:

(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] 

Aquí se puede ver, que (2 * 256) + MotionEvent.ACTION_MOVE no cambia el ID de puntero para el evento :( Y pointerToMove < < MotionEvent.ACTION_POINTER_INDEX_SHIFT enfoque no funciona para ACTION_POINTER_DOWN, puede ser que no tenga permiso para usar POINTER_DOWN?

Mi problema es que no puedo generar 2 pares de coordenadas para Pointer Pointer 0 y 1:

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

Aquí se puede ver, que el uso de la lógica He añadido PID1 al evento, pero todavía no tiene coordenadas, porque x e y se asociaron con pid 0 ..

Gracias de antemano.

Yahor

aún no tienen idea de cómo ponerlo en práctica, ¿Alguien alguna vez enviar un evento multi-touch?

+0

los solucionaron este problema? – thiagolr

Respuesta

2

Creo que solo necesita indicar el índice del puntero en el parámetro 'acción' pasado a MotionEvent.obtain. Específicamente, los 8 bits superiores de la acción son el índice del puntero y los 8 bits inferiores son la acción (por ejemplo, MotionEvent.ACTION_MOVE). Por lo tanto, si desea mover el segundo puntero esto debería funcionar:

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

-Dan

+0

Gracias por responder, ahora sé cómo elegir la identificación del puntero, utilizando su enfoque, pero en este caso, pId aparece sin coords: puede ver que el evento objeto de dumping tiene solo un par de coords: evento ACTION_POINTER_DOWN (pid 2) [# 0 (pid 0) = 138,189] para comparar, volcado original del evento, al tocar con los dedos: # evento ACTION_POINTER_DOWN (pid 1) [# 0 (pid 0) = 153,230; # 1 (pid 1) = 380,538] – user643154

Cuestiones relacionadas