2011-07-27 14 views
7

¿Es posible detectar el tamaño de dedos en una aplicación IOS? que he leído en la documentación:Cómo detectar Fingersize con IOS?

Notas: Un dedo en la pantalla ofrece una gran nivel diferente de precisión que un puntero del ratón. Cuando un usuario toca la pantalla, el área de contacto es en realidad elíptica y tiende a desplazarse por debajo de el punto donde el usuario cree que tocó. Este "parche de contacto " también varía en tamaño y forma según el dedo que toque la pantalla, el tamaño del dedo, la presión del dedo en la pantalla , la orientación del dedo y otros factores. El sistema subyacente Multi-Touch analiza toda esta información para usted y calcula un único punto de contacto.

Fuente: http://developer.apple.com/library/ios/#DOCUMENTATION/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html

Así que, ¿que los theres ninguna posibilidad de medias con el SDK para detectar la fingersize física? Lo que quiero lograr: necesito "botones" virtuales en mi aplicación OpenGL ES. Y si alguien sostiene el iPhone como un gamepad, probablemente usará un dedo para dos botones (deslizándose del pulgar). Espero que sea comprensible lo que quiero decir ...

¿Alguna idea?

+0

Se podía manejar '(void) touchesMoved: (NSSet *) toca withEvent: (UIEvent *) event' y verifica 'locationInView' de los toques dados. Así que tendrías una vista/área de gamepad y verificaría qué parte está golpeada/cubierta en touchesMoved. – marcus

+0

Pero puedo recuperar solo un CGPoint desde locationInView, y no para ambas posiciones de botón. Así que iOS parece detectar solo un "blob" (no ambos - un gran pulgar no se detecta con 2 toques) ... – Constantin

+2

Aún podría haber un área dentro de la vista del gamepad que sería válida para ambos botones - piense en los botones se cruzan entre sí. – marcus

Respuesta

11

@fichek tiene razón, no hay una manera regular de obtener el tamaño de la yema de los dedos.

Sin embargo, había utilizado una forma 'extraña' en mi proyecto anterior para hacerlo, y que sólo funciona ;-)

1.Tell nuestro usuario a poner dos dedos en la pantalla juntos, cuanto más cerca del mejor (como el desplazamiento gesto de dos dedos en Mac): enter image description here

2.Get los dos PuntosCg de UITouches en el touchesBegan: withEvent: método;

3.Now tenemos CGPoint fingertip1center y fingertip2center, por lo que:

float fingertip_Diameter=fabsf(fingertip1center.x-fingertip2center.x); 

4. Los dedos están muy cerca y que puede pasar por alto la pequeña diferencia de anchura, por lo dX == la ancho real de un dedo singel.

5.El ancho (DX) y el fingertipsize son proporcionales, podemos simplemente usar

float fingertip_Size=M_PI*(dX/2)*(dX/2);

o encontrar un mejor algoritmo para satisfacer sus necesidades ;-)

6. Una vez que tenemos el tamaño (en realidad nos sólo se preocupan por el diámetro), es fácil de poner en práctica un método para optimizar tocar probando varios rodeada puntos, por ejemplo:

#define kTestLevelOne 5 //Testing 5 points:origin,left,right,up,down 
#define kTestLevelTwo 9 //And the other 4 corners 
-(BOOL)testSurroundingPoints:(CGPoint *)pt 
{ 
    float prob_x[kTestLevelTwo]={0,-dX/2,dX/2,0,0,-dX/2,-dX/2,dX/2,dX/2}; 
    float prob_y[kTestLevelTwo]={0,0,0,dX/2,-dX/2,dX/2,-dX/2,dX/2,-dX/2}; 

    for(int i=0;i<kTestLevelTwo;i++) 
    { 
     if([self gotItAtX:pt.x+prob_x[i] andY:pt.y+prob_y[i]]==YES) 
     { 
      NSLog(@"Got It!"); 
      Return YES; 
      //Or break; We don't need to try more points! 
     } 
    } 
    return NO; 
} 

Esperamos que estos pueden ayudar!

Yichao Pico Ji

+0

¡Manera interesante! Muy útil, ¡gracias! – Constantin

2

iOS hace todo tipo de cálculos de tamaño de dedo/ángulo/ubicación detrás de las escenas, por lo que no hay forma de detectar nada más que la ubicación calculada de un toque. Sin embargo, es información más que suficiente para que sepas en qué parte del gamepad está el dedo.

Como mencionó @marcus, debe implementar el método touchesMoved: withEvent: y verificar la ubicación del toque para determinar si está sobre la izquierda/derecha/arriba/abajo/centro o los "botones" que quiera tener.

Cuestiones relacionadas