2016-01-01 16 views
7

私は、MorseとMorseを逆に変換する単純なMorseコードアプリを開発しています。ユーザが特定の文字を入力すると、デバイス上のカメラの光は、その文字のモールスシーケンスをフラッシュすることになっている。例えば:カメラのライトを特定の順序でフラッシュする方法は?

A =ドットが200msで、ダッシュが500msであるドットダッシュ。

問題は、これを達成する方法が正確にわからないことです。 forループを使ってこれを解決しようとしていますが、解決できないようです。以下は現在調整しようとしているコードです - forループを使用するのが最良の方法ですが、私は別の方法を考えることができません。誰もが提案/アイデアを持っていますか?もしそうなら、大いに感謝します。

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

答えて

1

このコードはあなたに問題を与えることが可能な理由は、光消灯し、再び上の折り返しの間で時間がないという事実によるものです。

瞬時に点灯します。その後、ランナブルは200ms待ってから電源を切る。それをオフにすると、すぐに再びオンになります。つまり、オフにするまでの時間は200msでしたが、オンに戻すまでの時間は0msでした。これにより、意図された休止がなくても、ライトが単に点灯しているように見えることがあります。

私が誤解していないならば、新しいpostDelayedハンドラを作成するだけで新しいスレッド上で実行可能ファイルを実行するだけです。モールスをキューに読み込ませたいので、あなたが望むものではありません。

はこのような何か試してみてください:

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

をあなたはおそらくも、スレッドの中断のための例外処理を実装する必要がありますが、これはあなたが使用できるかの基本的な構造です。 offIntervalTime変数があることに注目してください。これは、ライトがオフになるべき一定のギャップを定義するために使用されるため、実際にフラッシュすることができます。

関数を呼び出す、必ずそれがプライマリスレッドではないので、あなたはそれを呼び出すところ、このような何かを作る:

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

は、あなたの答えのためにどうもありがとうございます。このことについての研究をするときに、私はスレッドを見つけましたが、私はそれらを完全に理解していませんが、どういうふうに動作するのかは分かります。私は、オンとオフの間の光の間に時間間隔を入れることは考えていませんでした。これは決して私には起こりませんでした。私はあなたが提供したコードを含んでいます。私は思ったやり方でこれを手に入れることができます。もう一度ありがとう、非常に明確かつ簡潔な答え。 –

関連する問題