0

我正在使用带有频闪仪的手电筒应用程序,此时该应用程序正在运行,闪光灯正在使用按钮工作,并且在搜索栏的帮助下频闪的频率正在增加。

问题是,如果闪光灯打开并且我在搜索栏上向右拖动以启动并增加频闪效果的频率,但是如果我关闭闪光灯并在搜索栏上拖动某个点大于 0 并打开闪光灯的频闪效果它可以工作,但是当它打开时它仍然不会更新并增加频率,我必须关闭并再次打开手电筒来改变频率或停止频闪效果(当然当闪光灯是关闭移动 seekBar)。

你能帮我,让我明白为什么它不更新闪光灯,拜托!我将感激不尽 !谢谢!

这是代码:

搜索栏

SeekBar sbar = (SeekBar) findViewById(R.id.seekBar2);
    sbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            freq = progress;

        }

        public void onStartTrackingTouch(SeekBar seekBar) {


        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
    });
}

频闪跑者

private class StroboRunner implements Runnable{
    int freq;
    boolean stopRunning = false;
    volatile int delay = 100;
    volatile int delayoff = 200;

    @Override
    public void run() {
        Camera.Parameters paramsOn = camera.getParameters();
        Camera.Parameters paramsOff = parameter;
        paramsOn.setFlashMode(Parameters.FLASH_MODE_TORCH);
        paramsOff.setFlashMode(Parameters.FLASH_MODE_OFF);

        try{
            while(!stopRunning) {

                    MainActivity.this.camera.setParameters(paramsOn);
                    MainActivity.this.camera.startPreview();
                    Thread.sleep(delay - freq);

                    // We make the thread sleeping
                    MainActivity.this.camera.setParameters(paramsOff);
                    MainActivity.this.camera.startPreview();
                    Thread.sleep(delayoff-freq);

            }

        } catch (Exception e){

        }

    }
}

也用于打开和关闭我正在使用的手电筒

 private boolean turnOnOff(boolean on) {

    if (on) {
        if (freq != 0) {
            SunetON();
            isFlashLightOn = true;
            sr = new StroboRunner();
            sr.freq = freq;
            t = new Thread(sr);
            t.start();
            return on;
        }
        else
            parameter.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            SunetON();
    }
    if (!on) {
        if (t != null) {
            SunetOff();
            sr.stopRunning = true;
            isFlashLightOff = true;
            t = null;
            return on;
        }
        else
            parameter.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        SunetOff();
    }
    camera.setParameters(parameter);
    camera.startPreview();
    return on;
}

onClickListener

flashLight.setOnClickListener(new View.OnClickListener() {
         @Override
           public void onClick(View v) {
           isChecked = !isChecked;
           if (isChecked)
               flashLight.setImageResource(R.drawable.on);
           else
                flashLight.setImageResource(R.drawable.off);
                turnOnOff(isChecked);
          }
    });
4

1 回答 1

1

编辑:没关系,糟糕的 if/else 格式——turnOnOff 已经在外面了

一个好的起点是将 turnOnOff(isChecked) 移到 else 语句之外。

flashLight.setOnClickListener(new View.OnClickListener() {
         @Override
           public void onClick(View v) {
           isChecked = !isChecked;
           if (isChecked)
               flashLight.setImageResource(R.drawable.on);
           else
                flashLight.setImageResource(R.drawable.off);
          }

          turnOnOff(isChecked);
    });
于 2017-05-06T23:33:22.857 回答