【发布时间】:2017-01-04 16:46:32
【问题描述】:
我查看了有关触摸对焦的各种问题,但找不到“最佳”或“正确”的解决方案。我把一些答案放在一起并提出了这个实现:
mTextureView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
float positionX = (int) motionEvent.getX();
float positionY = (int) motionEvent.getY();
//Build the Rectangle, where the focus should be applied.
Rect focusRect = calculateFocusRect(motionEvent.getX(), motionEvent.getY());
MeteringRectangle meteringRectangle = new MeteringRectangle(focusRect, 500);
final MeteringRectangle[] meterRecArray = { meteringRectangle };
mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
//Set a captureRequest to cancel focus.
try {
mCameraCaptureSession.capture(mPreviewCaptureRequestBuilder.build(), mSessionCaptureCallback, mBackgroundHandler);
mState = STATE_PREVIEW;
} catch (CameraAccessException e) {
e.printStackTrace();
}
//Set the focusRegion.
mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, meterRecArray);
mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meterRecArray);
mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
//Restart the Preview, so changes apply.
try {
mCameraCaptureSession.abortCaptures();
mCameraCaptureSession.setRepeatingRequest(mPreviewCaptureRequestBuilder.build(), mSessionCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
Log.e("Camera", "RepeatingRequest Failed");
e.printStackTrace();
}
return false;
}
});
构建矩形的管理方式如下:
//Calculate a Rectangle, where the user touched the screen.
private MeteringRectangle[] calculateFocusRect(float x, float y) {
//Size of the Rectangle.
int areaSize = 200;
int left = clamp((int) x - areaSize / 2, 0, mTextureView.getWidth() - areaSize);
int top = clamp((int) y - areaSize / 2, 0, mTextureView.getHeight() - areaSize);
RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);
Rect focusRect = new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom));
MeteringRectangle meteringRectangle = new MeteringRectangle(focusRect, 1);
return new MeteringRectangle[] {meteringRectangle};
}
//Clamp the inputs.
private int clamp(int x, int min, int max) {
if (x > max) {
return max;
}
if (x < min) {
return min;
}
return x;
}
但它似乎并没有正常工作。点击后,相机似乎经常卡在无休止的扫描中。或者它聚焦并在获得焦点后立即跳回之前的焦点,图像最终变得模糊。
知道可能是什么问题吗?
【问题讨论】:
标签: java android camera android-camera2