Android Camera2 触摸对焦实施 - 取消新触摸
Android Camera2 touch to focus implementation - cancelling on new touch
我在使用 Camera2 API 实现触摸对焦时遇到问题。这是我的代码:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
if (isMeteringAreaAESupported()) {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS,
new MeteringRectangle[]{focusArea});
}
if (isMeteringAreaAFSupported()) {
mPreviewRequestBuilder
.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea});
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_AUTO);
}
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CameraMetadata.CONTROL_AF_TRIGGER_START);
try {
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null,
mBackgroundHandler);
mManualFocusEngaged = true;
} catch (CameraAccessException e) {
// error handling
}
我看到的问题是,当在短时间内多次调用上述代码时,某些设备上的闪光灯会出现奇怪的行为(即用户在设置焦点之前触摸屏幕的速度太快) .例如,在 S5 上,看起来所有的请求都在排队,如果用户触摸了很多次,它们就会一个一个地执行一段时间。在我的 Nexus 5 上,闪光灯不会因请求而闪烁,而是会一直亮着,直到最后一个请求执行完毕。
我想要的是真正取消飞行中的请求,就像他们在 Google 相机中所做的那样。如果您使用 Google 相机尝试使用闪光灯进行同样的操作,他们会在注册新触摸时立即取消请求。
我试过在上述方法之前添加 mCaptureSession.abortCaptures();
,但效果不一样,而且还开始掉帧。 mCaptureSession.stopRepeating();
完全没有任何区别。
显然我必须执行捕获请求才能取消 AF。
我在我的取消触发器的第一行之后添加了这个:
try {
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
mBackgroundHandler);
// After this, the camera will go back to the normal state of preview.
mState = STATE_PREVIEW;
} catch (CameraAccessException e){
// log
}
我在使用 Camera2 API 实现触摸对焦时遇到问题。这是我的代码:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
if (isMeteringAreaAESupported()) {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS,
new MeteringRectangle[]{focusArea});
}
if (isMeteringAreaAFSupported()) {
mPreviewRequestBuilder
.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea});
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_AUTO);
}
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CameraMetadata.CONTROL_AF_TRIGGER_START);
try {
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null,
mBackgroundHandler);
mManualFocusEngaged = true;
} catch (CameraAccessException e) {
// error handling
}
我看到的问题是,当在短时间内多次调用上述代码时,某些设备上的闪光灯会出现奇怪的行为(即用户在设置焦点之前触摸屏幕的速度太快) .例如,在 S5 上,看起来所有的请求都在排队,如果用户触摸了很多次,它们就会一个一个地执行一段时间。在我的 Nexus 5 上,闪光灯不会因请求而闪烁,而是会一直亮着,直到最后一个请求执行完毕。
我想要的是真正取消飞行中的请求,就像他们在 Google 相机中所做的那样。如果您使用 Google 相机尝试使用闪光灯进行同样的操作,他们会在注册新触摸时立即取消请求。
我试过在上述方法之前添加 mCaptureSession.abortCaptures();
,但效果不一样,而且还开始掉帧。 mCaptureSession.stopRepeating();
完全没有任何区别。
显然我必须执行捕获请求才能取消 AF。
我在我的取消触发器的第一行之后添加了这个:
try {
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
mBackgroundHandler);
// After this, the camera will go back to the normal state of preview.
mState = STATE_PREVIEW;
} catch (CameraAccessException e){
// log
}