Приложение мигает вспышкой камеры

Я хочу добавить в свое приложение новую функцию: я создал индикатор выполнения, и каждый раз при изменении прогресса вспышка будет мигать с задержкой, равной значению прогресса в миллисекундах.

Когда я изменяю прогресс, вспышка начинает мигать, но я ничего не могу сделать, пока она не достигнет числа миганий (20). Я хочу иметь возможность изменять задержку, даже если вспышка все еще мигает.

private void blink(int sleepMS) throws Exception{

    //int sleepMS=(1/10)*50;
    int flashCount=20;
    getCamera();
    camera.setPreviewTexture(new SurfaceTexture(0));
    camera.startPreview();
    Thread thr = new Thread();
    thr.start();

   for(int i=0;i<flashCount;i++) {
           flipFlash();
           thr.sleep(sleepMS);
           flipFlash();
           thr.sleep(sleepMS);
       }

    camera.stopPreview();
    //camera.release();


}

private void flipFlash(){
    if (isFlashOn) {
        params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        camera.setParameters(params);
        isFlashOn = false;
    } else{
        params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        camera.setParameters(params);
        isFlashOn = true;
    }
}

Где getCamera() получает параметры камеры. И код для слушателя SeekBar:

volumeControl = (SeekBar) findViewById(R.id.volume_bar);
volumeControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

  int progressChanged = 0;

  public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
      progressChanged = progress;

  }

  public void onStartTrackingTouch(SeekBar seekBar) {
      // TODO Auto-generated method stub

  }

  public void onStopTrackingTouch(SeekBar seekBar) {

          try {
              blink(100 - progressChanged);
          } catch (Exception e) {

          }
  }
});

person Alex Damian    schedule 05.02.2016    source источник


Ответы (1)


Поскольку ваш цикл for находится в основном потоке, он блокирует все остальные операции. Из вашего кода кажется, что вы хотели сделать что-то вроде этого:

Thread thr = new Thread(new Runnable() {
    @Override
    public void run() {
        for(int i=0;i<flashCount;i++) {
            flipFlash();
            thr.sleep(sleepMS);
            flipFlash();
            thr.sleep(sleepMS);
        }
    }
});
thr.start();
person Chris Stillwell    schedule 05.02.2016