SeekBar值未在while循环

时间:2017-01-15 16:36:20

标签: java android-studio while-loop android-seekbar flashlight

我正在尝试创建一个带有频闪(闪烁)效果的手电筒应用程序,我可以使用SeekBar更改(更改频闪的频率)。我的目标是我能够在频率开启(闪烁)时改变频率,如果搜索栏值变为0,则闪光灯应该开启(没有选通/闪烁)我的问题是我可以将其打开(使用Switch Btn,但是如果我无法关闭频闪时增加频率(但是Flash是仍然亮不闪烁)使用Seekbar 。如果我将Seekbar值设为0,它仍然以最低频率闪烁。

如果你能帮助我,我会很高兴。

代码: 公共类MainActivity扩展了AppCompatActivity {

Camera cam;
Parameters camParams;
boolean hasCam;
int freq;
StroboRunner sr;
Thread t;
SeekBar seekBar;

Switch mySwitch;
SeekBar skBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mySwitch = (Switch) findViewById(R.id.mySwitch);
    // set the Switch to off
    mySwitch.setChecked(false);
    //now you need a listener to check changes in state
    mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            turnOnOff(isChecked);
        }
    });
    skBar = (SeekBar) findViewById(R.id.seekBar);
    skBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            freq = progress;
        }
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
    });
}
@Override
protected void onResume() {
    super.onResume();
    try {
        cam = Camera.open();
        camParams = cam.getParameters();
        cam.startPreview();
        hasCam = true;
    }catch(Exception e){
    }
}
private void turnOnOff(boolean on){
    if(on) {
        if(freq != 0){
            sr = new StroboRunner();
            t = new Thread(sr);
            t.start();
            return;
        }else{
            camParams.setFlashMode(Parameters.FLASH_MODE_TORCH);
        }
    }else if(!on){
        if(t != null){
            sr.stopRunning = true;
            t =null;
            return;
        }else{
            camParams.setFlashMode(Parameters.FLASH_MODE_OFF);
        }
    }
    cam.setParameters(camParams);
    cam.startPreview();
}
private class StroboRunner implements Runnable {
    boolean stopRunning = false;
    @Override
    public void run() {
        Camera.Parameters paramsOn = cam.getParameters();
        Camera.Parameters paramsOff = camParams;
        paramsOn.setFlashMode(Parameters.FLASH_MODE_TORCH);
        paramsOff.setFlashMode(Parameters.FLASH_MODE_OFF);
        try {
            while (!stopRunning) {
                cam.setParameters(paramsOn);
                cam.startPreview();
                Thread.sleep((100 - freq)*1);
                cam.setParameters(paramsOff);
                cam.startPreview();
                Thread.sleep((100 - freq)*1);

            }
        }catch(Exception e){
            }
        }
    }

}

2 个答案:

答案 0 :(得分:0)

问题很简单但容易被忽视: 您有两个名为freq的变量,一个在StroboRunner中,一个在MainActivity中。

进度条更改时,MainActivity中的一个始终会更新,但StroboRunner中的代码会使用本地freq变量。只有在您创建新的StroboRunnersr.freq = freq;)后立即打开闪光灯时才会更新。 这就是为什么它再次关闭闪光灯后再次工作的原因。

如果我没有完全弄错,你应该能够通过删除freq类和行StroboRunner

中的sr.freq = freq;变量来解决这个问题。

答案 1 :(得分:0)

我终于找到了解决方法。现在它完美无缺(带有频闪效果的手电筒,当屏幕锁定时也能正常工作!)