gpt4 book ai didi

java - 在android上实现频闪(闪光灯闪烁)效果,以相同的频率闪烁

转载 作者:行者123 更新时间:2023-12-02 06:11:23 40 4
gpt4 key购买 nike

我正在实现工作正常的频闪功能(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

最佳答案

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

您的代码简化为:

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

处理常规 Activity 的常见方法如下:

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

请注意,时间间隔的计算将引用当天的时钟,并将现在时间所需时间进行比较。这样,一个循环与另一个循环执行速度之间的任何差异都将被忽略。代码总是计算出需要下一次切换的时间,并等到那时。因此,在很长一段时间内,速率应该是正确的,尽管单独的开启和关闭时间可能稍微不准确。

关于java - 在android上实现频闪(闪光灯闪烁)效果,以相同的频率闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21847337/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com