2012-04-04 5 views
1

Sorry, wenn der Titel klingt verwirrend - aber das ist, was ich zu tun versucht:Android Touch Richtung Nordwesten, Nordosten für UP Richtung

Ich habe einen großen runden Knopf, auf das ich Berührungsrichtung erkennen. Ich bin in der Lage die UP finden/AB/LINKS/RECHTS vom dy und dx der Änderung der Touch-Eingabe-Koordinaten wie folgt aus:

  if(Math.abs(dX) > Math.abs(dY)) { 
       if(dX>0) direction = 1; //left 
       else direction = 2; //right 
      } else { 
       if(dY>0) direction = 3; //up 
       else direction = 4; //down 
      } 

Aber jetzt würde Ich mag Fälle behandeln, wo der Knopf leicht gedreht werden kann, und damit muss sich auch die Touch-Richtung einstellen. Wenn der Knopf zum Beispiel leicht nach links gedreht wird, dann ist UP jetzt der Finger, der sich nach Nordwesten bewegt anstatt nur nach Norden. Wie gehe ich damit um?

Antwort

2

Verwenden Math.atan2 (dy, dx) den Winkel gegen den Uhrzeigersinn von der positiven Horizontalen des in Radianten Koordinate erhalten

double pressed = Math.atan2(dY, dX); 

subtrahieren den Drehbetrag (gegen den Uhrzeigersinn Drehbetrag in Radiant) von diesem Winkel , den Winkel in das Koordinatensystem des Knopfs

pressed -= buttonRotation; 

setzen oder wenn Sie in Graden Ihren Winkel haben, wandelt es

012.351 bis radians
pressed -= Math.toRadians(buttonRotation); 

Sie können dann eine einfachere Richtung Nummer aus diesem Winkel

int dir = (int)(Math.round(2.0d*pressed/Math.PI) % 4); 

Dies gibt rechts 0 bis 1, links 2 und ab 3. Wir haben den Fall korrigieren müssen berechnen, wo der Winkel negativ ist, wie das Modulo-Ergebnis wird ebenfalls negativ sein.

if (dir < 0) { 
    dir += 4; 
} 

nun angenommen, dass diese Zahlen sind schlecht, und Sie wollen nicht, sie benutzen, können Sie auf das Ergebnis schalten nur, was Sie für jede Richtung wie zurückzukehren. Putting, dass alle zusammen:

/** 
* @param dY 
*  The y difference between the touch position and the button 
* @param dX 
*  The x difference between the touch position and the button 
* @param buttonRotationDegrees 
*  The anticlockwise button rotation offset in degrees 
* @return 
*  The direction number 
*  1 = left, 2 = right, 3 = up, 4 = down, 0 = error 
*/ 
public static int getAngle(int dY, int dX, double buttonRotationDegrees) 
{ 
    double pressed = Math.atan2(dY, dX); 
    pressed -= Math.toRadians(buttonRotationDegrees); 

    // right = 0, up = 1, left = 2, down = 3 
    int dir = (int)(Math.round(2.0d*pressed/Math.PI) % 4); 

    // Correct negative angles 
    if (dir < 0) { 
     dir += 4; 
    } 

    switch (dir) { 
     case 0: 
      return 2; // right 
     case 1: 
      return 3; // up 
     case 2: 
      return 1; // left; 
     case 3: 
      return 4; // down 
    } 
    return 0; // Something bad happened 
} 
+0

Dank Matt, ich denke, das ist genau das, was ich brauche. Tolle Antwort! – MikeT