Чтобы реализовать касание для фокусировки на API-интерфейсе Android-камеры 2, необходимо преобразовать координаты касания на экране в координаты датчика камеры, которые согласно этому ответу не совпадают.
Я хочу реализовать сенсорный фокус для камеры 2 api, для которой координаты касания должны быть масштабированы в соответствии с размером активной матрицы датчика камеры
Я уже пробовал эту суть , но вычисление прямоугольника измерения не имеет смысла для меня, и фокус также не работает. Это приводит к отрицательному значению для левого, верхнего, правого и нижнего прямоугольника, в зависимости от того, где кто-то касается экрана.
Я также попробовал это и получил ту же вышеупомянутую проблему.
Я слежу за camera2basic кодом Android.
Это код, который, как я думал, будет работать, но он не фокусируется на месте касания экрана:
mTextureView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
Rect sensor_array_size =characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
focusCameraOnArea(
(int)(sensor_array_size.width()*(event.getX()-event.getTouchMajor())/mTexturePreview.getWidth()),
(int)(sensor_array_size.height()*(event.getY()-event.getTouchMinor())/mTexturePreview.getHeight()),
(int)(event.getX()+event.getTouchMajor()),
(int)(event.getY()+event.getTouchMinor());
}
return true;
}
});
private void focusCameraOnArea(int x, int y, int width, int height){
MeteringRectangle focusArea = new MeteringRectangle(x, y, width, height);
CameraCaptureSession.CaptureCallback focusCaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
if(request.getTag()=="FOCUS_TAG"){
try{
mPreviewRequestBuilder.set(
CaptureRequest.CONTROL_AF_TRIGGER,null);
mCaptureSession.setRepeatingRequest(
mPreviewRequestBuilder.build(),null,null);}
catch(CameraAccessException e){
e.printStackTrace();}
}
}
@Override
public void onCaptureFailed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureFailure failure) {
super.onCaptureFailed(session, request, failure);
Log.wtf(TAG, "Manual AF failure: " + failure);
}
};
mCaptureSession.stopRepeating();
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
mCaptureSession.capture(mPreviewRequestBuilder.build(),focusCaptureCallback,mBackgroundHandler);
if(characteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF) >= 1){
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea});
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, new MeteringRectangle[]{focusArea});
}
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE,CaptureRequest.CONTROL_MODE_AUTO);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_AUTO);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AF_TRIGGER_START);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON);
mPreviewRequestBuilder.setTag("FOCUS_TAG");
mCaptureSession.capture(mPreviewRequestBuilder.build(),focusCaptureCallback,mBackgroundHandler);
}catch(CameraAccessException e){e.printStackTrace();}
catch (Exception e){e.printStackTrace();}
}