【问题标题】:Implementing strobe (Flash Light Blinking) effect on android which blinks with the same frequency在以相同频率闪烁的android上实现频闪(闪光灯闪烁)效果
【发布时间】:2014-02-18 07:52:58
【问题描述】:

我正在实现可以正常工作的频闪功能(LED 相机闪光灯打开/关闭)我发生的问题是在不同设备中以不同频率打开/关闭。在 HTC SensationXE 中它的闪烁速度很快,而在 NEXUS 中它的闪烁速度很慢不知道是什么问题。任何人都可以帮忙吗: 这是代码:

    /*
 * This method turn on the LED camera flash light
 */
public void flashLightOn() {
    Log.d("Time", "On");
    if (!isFlashOn) {
        if (cam != null || params != null) {
            params.setFlashMode(Parameters.FLASH_MODE_TORCH);
            cam.setParameters(params);
            cam.startPreview();
            isFlashOn = true;
        } else {
            cam = Camera.open();
            params = cam.getParameters();
            params.setFlashMode(Parameters.FLASH_MODE_TORCH);
            cam.setParameters(params);
            cam.startPreview();
            isFlashOn = true;
        }
    }
    else{
        return;
    }
}

/*
 * This method turn off the LED camera flash light
 */
public void flashLightOff() {
    Log.d("Time", "Off");
    if (isFlashOn) {
        if (cam != null || params != null) {
            //params.setFlashMode(Parameters.FLASH_MODE_OFF);
            //cam.setParameters(params);
            cam.stopPreview();
            isFlashOn = false;
        }
        else{
            //params = cam.getParameters();
            //params.setFlashMode(Parameters.FLASH_MODE_OFF);
            //cam.setParameters(params);
            cam.stopPreview();
            isFlashOn = false;  
        }


    }
    else{
        return;
    }
}



@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mHolder = holder;
    try {
        cam.setPreviewDisplay(mHolder);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    cam.stopPreview();
    mHolder = null;

}

private final Runnable mRunnable = new Runnable() {

    public void run() {
        if (mActive) {
            if (mSwap) {
                flashLightOn();
                mSwap = false;
                mHander.postDelayed(mRunnable, strobeOnDelay);
            } else {
                flashLightOff();
                mSwap = true;
                mHander.postDelayed(mRunnable, strobeOffDelay);
            }
        }
    }
};

我的课是实现 SurfaceHolder.Callback

【问题讨论】:

    标签: java android camera android-camera flashlight


    【解决方案1】:

    run 方法使用固定参数调用延迟操作。这意味着延迟将花费计算机上其他所有内容的处理时间加上延迟期。 “其他一切”在您的代码中可能看起来既小又快,但它也包括竞争处理器时间等的所有其他进程的工作。

    您的代码简化为:

    LoopForever
        Do some processing to toggle light ON or OFF;
        Delay for a fixed time;
    EndLoop
    

    处理常规活动的常用方法如下:

    LoopForever
        Do some processing to toggle light ON or OFF;
        Calculate time interval until next toggle wanted.
        Delay for the calculated interval;
    EndLoop
    

    请注意,时间间隔的计算将参考时钟并将time-now 与time-wanted 进行比较。这样一来,一个循环与另一个循环执行速度之间的任何差异都将被忽略。代码总是会计算出需要下一次切换的时间,然后一直等到那时。因此,在很长一段时间内,速率应该是正确的,尽管个别的 ON 和 OFF 时间可能稍微不准确。

    【讨论】:

    • 非常感谢您的帮助,您真是太好了。我会试试的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多