我正在开发一个简单的莫尔斯代码应用程序,将英语转换为莫尔斯语,反之亦然。当用户输入特定字母时,设备上的摄像头灯应该闪烁该字母的莫尔斯序列,例如:
A =点划线,点为200毫秒,短划线为500毫秒。
问题在于我不确定如何实现这一目标。我试图使用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();
}
}
答案 0 :(得分:1)
此代码可能会给您带来问题的原因是由于灯光关闭和重新开启之间没有时间。
瞬间,灯亮了。然后,可运行等待200ms,然后再将其关闭。关闭后,它会立即再次打开,这意味着虽然将其打开到关闭之间的点是200毫秒,但是将其关闭再打开之间的时间是(接近)0毫秒。这可能会导致灯光一直亮起而没有任何预期的暂停。
如果我没弄错的话,创建一个新的postDelayed处理程序只需在新线程上执行runnable,由于您希望在队列中读取莫尔斯,这实际上并不是您想要的。 / p>
尝试这样的事情:
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变量。这用于定义灯应该关闭的恒定间隙,从而允许它实际闪烁。
当您调用该函数时,请确保它不在主线程上,因此请执行以下操作:#/ p>
Thread morseMessageThread = new Thread(new Runnable() { flashTranslation() });
morseMessageThread.start();