如何让相机灯按特定顺序闪烁?
How to make the camera light flash in a specific sequence?
我正在开发一个简单的摩尔斯电码应用程序,可以将英语转换为摩尔斯电码,反之亦然。当用户输入特定字母时,设备上的相机灯应该会闪烁该字母的摩尔斯序列,例如:
A = 点划线,点为 200 毫秒,划线为 500 毫秒。
问题是我不确定具体如何实现。我一直在尝试使用 for 循环来解决这个问题,但我似乎无法解决它。下面是我目前正在尝试调整的代码——我不确定使用 for 循环是否是最好的方法,但我想不出其他方法。有没有人有 suggestions/ideas,如果有的话,将不胜感激。
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();
}
}
此代码可能给您带来问题的原因是灯关闭和再次打开之间没有时间。
瞬间,灯亮了。然后,runnable 在关闭之前等待 200 毫秒。关闭后,它会立即再次打开它,这意味着虽然从打开到关闭之间的时间点是 200 毫秒,但从关闭到重新打开之间的时间是(接近)0 毫秒。这可能导致灯看起来一直亮着,没有任何预期的暂停。
如果我没记错的话,创建一个新的 postDelayed 处理程序只是在一个新线程上执行一个 runnable,这并不是您真正想要的,因为您希望在队列中读取莫尔斯码.
尝试这样的事情:
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();
我正在开发一个简单的摩尔斯电码应用程序,可以将英语转换为摩尔斯电码,反之亦然。当用户输入特定字母时,设备上的相机灯应该会闪烁该字母的摩尔斯序列,例如:
A = 点划线,点为 200 毫秒,划线为 500 毫秒。
问题是我不确定具体如何实现。我一直在尝试使用 for 循环来解决这个问题,但我似乎无法解决它。下面是我目前正在尝试调整的代码——我不确定使用 for 循环是否是最好的方法,但我想不出其他方法。有没有人有 suggestions/ideas,如果有的话,将不胜感激。
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();
}
}
此代码可能给您带来问题的原因是灯关闭和再次打开之间没有时间。
瞬间,灯亮了。然后,runnable 在关闭之前等待 200 毫秒。关闭后,它会立即再次打开它,这意味着虽然从打开到关闭之间的时间点是 200 毫秒,但从关闭到重新打开之间的时间是(接近)0 毫秒。这可能导致灯看起来一直亮着,没有任何预期的暂停。
如果我没记错的话,创建一个新的 postDelayed 处理程序只是在一个新线程上执行一个 runnable,这并不是您真正想要的,因为您希望在队列中读取莫尔斯码.
尝试这样的事情:
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();