2016-01-01 1 views
7

Ich entwickle eine einfache Morse-Code-App, die Englisch in Morse konvertiert und umgekehrt. Wenn der Benutzer einen bestimmten Buchstaben eingibt, soll die Kameralampe auf dem Gerät die Morse-Sequenz für den Buchstaben anzeigen, zum Beispiel:Wie kann man die Kamera in einer bestimmten Reihenfolge aufleuchten lassen?

A = Punktstrich mit dem Punkt, der 200ms ist und der Strich 500ms ist.

Das Problem ist, dass ich nicht sicher bin, wie genau dies zu erreichen ist. Ich habe versucht, dies mit einer for-Schleife zu lösen, aber ich kann nicht scheinen, es zu lösen. Unten ist der Code, den ich gerade versuche einzustellen - ich bin nicht sicher, ob die Verwendung einer for-Schleife die besten Methoden ist, aber ich kann nicht auf eine andere Weise denken. Hat jemand irgendwelche Vorschläge/Ideen, wenn ja, würden sie sehr geschätzt werden.

public void flashTranslation() { 

    char[] cArray = message.toCharArray(); 

    for (int i = 0; i < cArray.length; i++) { 


     if (cArray[i] == '.') { 
      turnOn(); 

      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        turnOff(); 

        camera.release(); 
       } 
      }, dot); 

     } else { 

      turnOn(); 

      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        turnOff(); 

        camera.release(); 
       } 
      }, dash); 
     } 

    } 
} 

public void turnOn() { 

    if (camera != null) { 
     Camera.Parameters p = camera.getParameters(); 
     p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(p); 
     camera.startPreview(); 
    } 


} 

public void turnOff() { 

    if (camera != null) { 
     Camera.Parameters p = camera.getParameters(); 
     p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
     camera.setParameters(p); 
     camera.stopPreview(); 
    } 
} 

Antwort

1

Der Grund dieser Code kann Probleme werden gibt, ist aufgrund der Tatsache, dass es keine Zeit in zwischen dem Licht ausgeschaltet und wieder einschalten.

In einem Augenblick schaltet sich das Licht ein. Dann wartet das runnable 200ms vor dem Ausschalten. Nach dem Ausschalten schaltet sich das Gerät sofort wieder ein. Das heißt, obwohl der Punkt zwischen dem Ein- und Ausschalten 200 ms betrug, war die Zeit zwischen dem Ausschalten und dem Einschalten 0 ms. Dies könnte dazu führen, dass das Licht einfach ohne die beabsichtigten Pausen durchgängig erscheint.

Wenn ich mich nicht irre, führt die Erstellung eines neuen postDelayed-Handlers einfach einen Runnable für einen neuen Thread aus, was nicht wirklich das ist, was Sie wollen, weil der Morse in einer Warteschlange gelesen werden soll.

versuchen, etwas wie folgt aus:

public void flashTranslation() { 
    int offIntervalTime = 50; 

    char[] cArray = message.toCharArray(); 

    for (int i = 0; i < cArray.length; i++) { 
     if (cArray[i] == '.') { 
      turnOn(); 
      Thread.sleep(dot); 

      turnOff(); 
      Thread.sleep(offIntervalTime); 
     } else { 
      turnOn(); 
      Thread.sleep(dash); 

      turnOff(); 
      Thread.sleep(offIntervalTime); 
     } 
    } 
} 

Sie werden wahrscheinlich brauchen auch Ausnahme für Thread Unterbrechungen Handhabung zu implementieren, aber dies ist die grundlegende Struktur von dem, was Sie verwenden können. Beachten Sie, dass eine Variable offIntervalTime vorhanden ist. Dies wird verwendet, um die konstante Lücke zu definieren, in der das Licht ausgeschaltet sein sollte, so dass es tatsächlich blinken kann.

Wenn Sie die Funktion aufrufen, stellen Sie sicher, dass es nicht auf dem primären Thread ist, so tun dies so etwas wie, wo man es nennen:

Thread morseMessageThread = new Thread(new Runnable() { flashTranslation() }); 
morseMessageThread.start(); 
+0

Dank für Ihre Antwort danken. Als ich nachforschte, wie ich das anstellen kann, bin ich auf Threads gestoßen, aber ich verstehe sie nicht vollständig - aber ich werde definitiv lernen, wie sie funktionieren. Ich habe nicht daran gedacht, ein Zeitintervall zwischen dem Ein- und Ausschalten des Lichts einzuplanen - das ist mir nie in den Sinn gekommen. Ich habe den Code, den du geliefert hast, mit eingeschlossen und ich denke, dass ich mit der Zeit ein Tweaking machen kann, damit ich so arbeiten kann, wie ich es möchte! Nochmals vielen Dank, eine sehr klare und prägnante Antwort. –