繁体   English   中英

频闪灯工作正常,但单击时效果不佳

[英]Strobe light is working fine but doesn't work very well on click

我创建了以下频闪灯。 我希望它在按下按钮时开始,如果再次按下则停止。 现在,当它打开并单击时,它会关闭,但是再次单击时,什么也不会发生!

没有点击侦听器,它会在应用程序启动时启动,但效果很好,但是无法停止它。

    public class Small extends Activity {

    private MMAdView adViewFromXml;
    RefreshHandler handler;
    ImageButton knob;
    int n=100000;
    Camera mCamera;
    Parameters params;
    int delay = 400; // in ms
    public boolean on;
    public boolean works;
    Thread logotimer;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_small_button);

        knob = (ImageButton) findViewById(R.id.pic);
        strobe();

        knob.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View iv) {
                  if(works == true){
                      logotimer.interrupt();
                  }else if(works != true)
                  {
                      strobe();
                  }
              }
            });

                }); 

    }

    /** Turn the devices FlashLight on */
    public void turnOn() {
      if (mCamera != null) {
        // Turn on LED
        params = mCamera.getParameters();
        params.setFlashMode(Parameters.FLASH_MODE_TORCH);
        mCamera.setParameters(params);
        mCamera.startPreview();
        on = true;
      }

    }

    /** Turn the devices FlashLight off */
    public void turnOff() {
      // Turn off flashlight
      if (mCamera != null) {
        params = mCamera.getParameters();
        params.setFlashMode(Parameters.FLASH_MODE_OFF);
        mCamera.setParameters(params);
        mCamera.stopPreview();


      }
      on = false;
    }

    /** Toggle the flashlight on/off status */
    /*public void toggleFlashLight() {
        if (!on) { // Off, turn it on
        turnOn();
      } else { // On, turn it off
        turnOff();
      }
}*/
    private void strobe(){
      Thread logotimer = new Thread() {
        public void run() {
          try {
            // Switch on the cam for app's life
            if (mCamera == null) {
              // Turn on Cam
              try{
                mCamera = Camera.open();
              } catch (RuntimeException e) {
                Log.e("Camera Error. Failed to Open. Error: ", e.getMessage());
              }
              try {
                mCamera.setPreviewDisplay(null);
              } catch (IOException e) {
                e.printStackTrace();
              }
              mCamera.startPreview();
            }
            int logotimer = 0;
            while(!interrupted() && logotimer <5000) {
                logotimer = logotimer ++;
                works = true;

                if (!on) { // Off, turn it on
                    turnOn();
                  } else if(on == true) { // On, turn it off
                    turnOff();
                  }
                sleep(delay);
            }
            if (mCamera == null) {
              mCamera.stopPreview();
              mCamera.release();
              mCamera = null;
            }
          } catch (InterruptedException e){ 

            e.printStackTrace(); 
          }
        }
      };logotimer.start();
    }
}

日志猫:

01-08 15:17:33.807: W/System.err(28814): java.lang.InterruptedException
01-08 15:17:33.808: W/System.err(28814):    at java.lang.VMThread.sleep(Native Method)
01-08 15:17:33.808: W/System.err(28814):    at java.lang.Thread.sleep(Thread.java:1013)
01-08 15:17:33.808: W/System.err(28814):    at java.lang.Thread.sleep(Thread.java:995)
01-08 15:17:33.809: W/System.err(28814):    at com.light.oid.Small$4.run(Small.java:163)

在onClick内添加strobe()调用:

@Override
public void onClick(View iv) {
    if(works) {
        logotimer.interrupt();

    } else {
        //mCamera = Camera.open(); //remove this
        //and add strobe()
        strobe(); 
    }
}

另外,您具有全局Thread logotimer,但是在strobe()方法中,您将创建一个具有相同名称的局部变量,因此,在单击按钮时,logotimer为null,因为局部阴影覆盖了全局变量。

在strobe()中,更改:

 private void strobe(){
     Thread logotimer = new Thread() {
         public void run() {

至:

 private void strobe(){
     logotimer = new Thread() {
         public void run() {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM