2016-07-19 17 views
0

Ich versuche, eine App wie "Heads-up" nur für mehr Bewegung zu machen!Logisches Problem während der Verwendung von Beschleunigungsmesser

, aber jetzt habe ich einige logische Problem bei der Verwendung von Beschleunigungsmesser in meiner App konfrontiert.

Ich möchte die App "korrigieren", wenn es kippt (Beschleunigungsmesser gibt -7 in dieser Position) und Toast "falsch", wenn die Neigung nach oben (Beschleunigungsmesser gibt 7 oder mehr in dieser Position).

Aber das Problem war, dass App mehrmals in jeder Position Toast. Also habe ich einen booleschen (isToasted) verwendet, um den App-Toast einmal in jeder dieser Positionen zu machen. Aber jetzt röstet es überhaupt nicht!

wo ist mein Problem und was soll ich tun?

dies ist ein Teil meines Codes:

Boolean isToasted = false; 

@Override 
public void onSensorChanged(SensorEvent event) { 
    int sensorValue = (int) event.values[2]; 

    while (isToasted) { 
     switch (sensorValue) { 
      case 7: { 
       Toast.makeText(find_word2.this, "wrong", Toast.LENGTH_SHORT).show(); 
       isToasted = true; 
       break; 
      } 
      case -7: { 
       Toast.makeText(find_word2.this, "correct", Toast.LENGTH_SHORT).show(); 
       isToasted = true; 
       break; 
      } 
     } 
    } 
    if (sensorValue == 0) isToasted = false; //sensorValue = 0 means device is not tilted and it's in direct position. 
} 
+0

Fehlerprotokolle oder Stack-Trace? – Shek

+0

gibt es kein Fehlerprotokoll –

+0

isToasted wird nie mit Ihrem aktuellen Code wahr sein. Es ist standardmäßig auf "false" gesetzt. – Compass

Antwort

0

Der Grund wäre es die Toast mehrere Male in jeder Position angezeigt werden, weil ein SensorEventmultiple times an einer einzigen Position auftreten können:

Beachten Sie, dass „auf geändert“ ist etwas irreführend, da dies wird auch genannt, wenn wir einen neuen Messwert von einem Sensor mit den exakt gleichen Sensorwerten haben (aber einen neueren Zeitstempel).

Daher gibt jedes Mal ein SensorEvent, die eine der z-Werte, die Sie in Ihrer Switch-Anweisung angegeben hat ein Toast angezeigt. Sie waren auf dem richtigen Weg, indem Sie einen boolean Wert hinzufügen, um zu verfolgen, ob die Nachricht bereits angezeigt wurde, aber die while Schleife, die Sie haben, wird nie ausgeführt, weil isToasted auf false gesetzt ist.

Eigentlich brauchen Sie nicht einmal eine Schleife. Alles, was Sie tun müssen, ist zu überprüfen, ob der Z-Wert zwischen zwei Werten liegt. Wenn ja, setzen Sie boolean auf True. Wenn nicht, überprüfen Sie, ob boolean wahr ist und der z-Wert über oder unter dem Bereich liegt. Dann können Sie die Toast entsprechend einstellen und die boolean auf false setzen, damit die Nachricht nicht ein zweites Mal angezeigt wird.

private boolean isReset = true; 
private float mMaxValue = 7; 
private float mDeadZone = 5; 

@Override 
public void onSensorChanged(SensorEvent event) { 
    float value = event.values[2]; 

    if(value >= mDeadZone || value <= -mDeadZone) { 
     if(isReset && value <= -mMaxValue) { 
      Toast.makeText(find_word2.this, "correct", Toast.LENGTH_SHORT).show(); 
      isReset = false; 
     } else if(isReset && value >= mMaxValue) { 
      Toast.makeText(find_word2.this, "wrong", Toast.LENGTH_SHORT).show(); 
      isReset = false; 
     } 
    } else { 
     isReset = true; 
    } 
} 

Sie könnten auch eine „tote Zone“, indem sie den Bereich in der äußeren if Aussage niedriger als der Maximalwert schaffen. Dies würde sicherstellen, dass der Benutzer das Gerät näher an Null zurücksetzen müsste, bevor die Toast erneut angezeigt werden könnte.

+0

ah danke. Ich habe es ausprobiert und jetzt funktioniert es richtig, wenn ich "falsch" zeige, aber es tost überhaupt nicht "richtig"! –

+0

@ahmadmohseni Ah, meine Schuld. Der 'Wert' sollte auch in eine 'Math.abs()' Funktion eingeschlossen sein, oder einfach einen einfachen' || 'Operator verwenden. Ich habe die Antwort bearbeitet, es sollte jetzt funktionieren. – Bryan

+0

@ahmadmohseni Ich habe eine einfache [Geige] (http://ideone.com/wuLL20) gemacht, die 'onSensorChanged' nachahmt. Er gibt den "SensorEvent" Z-Wert aus, sowie "Korrigieren", wenn der Wert gleich oder unter -7 ist und "Falsch", wenn der Wert gleich oder größer als 7 ist. In diesem Fall ist 'IstReset' immer wahr, weil Ich setze den Wert immer nach jedem Aufruf auf Null zurück. – Bryan

0

Der Unterschied zwischen do-while und während tun, ist, dass während- seine Expression an der Unterseite der Schleife anstelle der oben auswertet. Daher werden die Anweisungen innerhalb des Do-Blocks immer mindestens einmal unter ausgeführt.

+0

Dadurch wird für jeden Aufruf von 'onSensorChanged() 'eine Endlosschleife erstellt, da sich der' sensorValue' niemals während eines einzelnen Aufrufs ändert. Wenn Sie die Schleife vollständig entfernen, sollte dies wie erwartet funktionieren. – Bryan

+0

@Bryan du hast Recht – Shek

Verwandte Themen