我正在尝试根据摩尔斯电码(文本)中的给定文本打开LED和特定长度(out_tic)。 我尝试使用“postDelay”以及sleep()或wait()来解决这个问题,但闪存始终具有相同的长度或应用程序崩溃。 我认为这是因为当Flash尚未关闭时,它会被告知启动。
cam = Camera.open();
Handler handler = new Handler();
for(int i=0;i<Text.length();i++){
if(Text.charAt(i)=='.' ||Text.charAt(i)=='·'){
ledon();
handler.postDelayed(new Runnable() {
public void run() {
ledoff();
}
}, out_tic);
}
else if(Text.charAt(i)=='-'){
ledon();
handler.postDelayed(new Runnable() {
public void run() {
ledoff();
}
}, 3*out_tic);
}
else if(Text.charAt(i)=='/'){
if(Text.charAt(i-1)=='/'){
}
}
}
ledon()和ledoff()方法只需设置参数并启动/停止预览。
感谢您的帮助!
适合我的新代码:
(由于JRaymond)
final String Text = "./-..-/.-/--/.--./.-.././/";
final int out_tic = 200;
new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<Text.length();i++){
if(Text.charAt(i)=='.' ||Text.charAt(i)=='·'){
flash(out_tic);
flashpause(out_tic);
continue;
}
else if(Text.charAt(i)=='-'){
flash(3*out_tic);
flashpause(out_tic);
continue;
}
else if(Text.charAt(i)=='/'){
flashpause(2*out_tic);
if(Text.charAt(i-1)=='/'){
flashpause(4*out_tic);
}
}
}
}
}).start();
}
private Handler handler = new Handler();
private void flash(final int sleeptime) {
handler.post(new Runnable() {
@Override
public void run() {
ledon();
}
});
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e){
}
handler.post(new Runnable(){
public void run() {
ledoff();
}
});
}
private void flashpause(final int sleeptime) {
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e){
}
}
private Camera cam;
private void ledon() {
cam = Camera.open();
Parameters params = cam.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(params);
cam.startPreview();
}
private void ledoff() {
cam.stopPreview();
cam.release();
}
答案 0 :(得分:0)
我想我已经完成了你的拼图 - 你的所有可运行的东西都被发布了,所以它们几乎同时发生。 postDelayed
从现在起计划Runnable
一段时间,而不是从最后Runnable
计划的时间开始计划。我认为你最好的解决方案是这样的,它将LED控制卸载到另一个线程:
cam = Camera.open();
Handler handler = new Handler();
new Thread(new Runnable() {
public void run() {
for(int i=0;i<Text.length();i++){
if(Text.charAt(i)=='.' ||Text.charAt(i)=='·') {
flash(out_tic);
continue;
}
else if(Text.charAt(i)=='-'){
flash(3 * out_tic)
continue;
}
// I don't quite understand what this does, but the same principles apply
else if(Text.charAt(i)=='/'){
//Warte 2*out_tic lang (1mal wurde schon gewartet)
if(Text.charAt(i-1)=='/'){
}
}
}
}
private void flash(int tic) {
handler.post(new Runnable() {
public void run() {
ledon();
}
});
try {
Thread.sleep(out_tic);
} catch (InterruptedException e) {
}
handler.post(new Runnable() {
public void run() {
ledoff();
}
}
}
});
请注意,上面的内容非常混乱,你可能想要移动一下并清理一下 - 但是想法是让你让一个不同的线程从UI做睡眠,然后回到处理程序时相机参数需要更改。