rough draft of implementing autofocus

pull/1/head
Caleb Lewis 8 years ago
parent 325436b4d6
commit 29ccf4fa6a
  1. 117
      camerakit/src/main/api16/com/flurgle/camerakit/Camera1.java

@ -1,19 +1,25 @@
package com.flurgle.camerakit; package com.flurgle.camerakit;
import android.graphics.Rect;
import android.graphics.YuvImage; import android.graphics.YuvImage;
import android.hardware.Camera; import android.hardware.Camera;
import android.media.CamcorderProfile; import android.media.CamcorderProfile;
import android.media.MediaRecorder; import android.media.MediaRecorder;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.View;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import static android.content.ContentValues.TAG;
import static com.flurgle.camerakit.CameraKit.Constants.FLASH_OFF; import static com.flurgle.camerakit.CameraKit.Constants.FLASH_OFF;
import static com.flurgle.camerakit.CameraKit.Constants.FOCUS_CONTINUOUS; import static com.flurgle.camerakit.CameraKit.Constants.FOCUS_CONTINUOUS;
import static com.flurgle.camerakit.CameraKit.Constants.FOCUS_OFF; import static com.flurgle.camerakit.CameraKit.Constants.FOCUS_OFF;
@ -24,6 +30,11 @@ import static com.flurgle.camerakit.CameraKit.Constants.METHOD_STILL;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class Camera1 extends CameraImpl { public class Camera1 extends CameraImpl {
private static final int FOCUS_AREA_SIZE_DEFAULT = 300;
private static final int FOCUS_METERING_AREA_WEIGHT_DEFAULT = 800;
private View view;
private int mCameraId; private int mCameraId;
private Camera mCamera; private Camera mCamera;
private Camera.Parameters mCameraParameters; private Camera.Parameters mCameraParameters;
@ -32,8 +43,11 @@ public class Camera1 extends CameraImpl {
private Size mCaptureSize; private Size mCaptureSize;
private MediaRecorder mMediaRecorder; private MediaRecorder mMediaRecorder;
private File mVideoFile; private File mVideoFile;
private Camera.AutoFocusCallback mAutofocusCallback;
private int mDisplayOrientation; private int mDisplayOrientation;
private int mFocusAreaSize = 0;
private int mFocusMeteringAreaWeight = 0;
@Facing @Facing
private int mFacing; private int mFacing;
@ -52,6 +66,7 @@ public class Camera1 extends CameraImpl {
Camera1(CameraListener callback, PreviewImpl preview) { Camera1(CameraListener callback, PreviewImpl preview) {
super(callback, preview); super(callback, preview);
this.view = preview.getView();
preview.setCallback(new PreviewImpl.Callback() { preview.setCallback(new PreviewImpl.Callback() {
@Override @Override
public void onSurfaceChanged() { public void onSurfaceChanged() {
@ -147,7 +162,8 @@ public class Camera1 extends CameraImpl {
break; break;
case FOCUS_TAP: case FOCUS_TAP:
setFocus(FOCUS_CONTINUOUS); mCameraParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
attachFocusTapListener();
break; break;
case FOCUS_OFF: case FOCUS_OFF:
@ -279,8 +295,107 @@ public class Camera1 extends CameraImpl {
return mCamera != null; return mCamera != null;
} }
void setFocusAreaSize(int size) {
mFocusAreaSize = size;
}
/**
* @link {@link android.hardware.Camera.Area#weight}
*/
void setFocusMeteringAreaWeight(int weight) {
mFocusMeteringAreaWeight = weight;
}
void setTapToAutofocusListener(Camera.AutoFocusCallback callback) {
if (this.mFocus != FOCUS_TAP) {
throw new IllegalArgumentException("Please set the camera to FOCUS_TAP.");
}
this.mAutofocusCallback = callback;
}
private int getFocusAreaSize() {
if (mFocusAreaSize == 0) {
return FOCUS_AREA_SIZE_DEFAULT;
} else {
return mFocusAreaSize;
}
}
private int getFocusMeteringAreaWeight() {
if (mFocusMeteringAreaWeight == 0) {
return FOCUS_METERING_AREA_WEIGHT_DEFAULT;
} else {
return mFocusMeteringAreaWeight;
}
}
// Internal: // Internal:
private void attachFocusTapListener() {
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (mCamera != null ) {
Camera.Parameters parameters = mCamera.getParameters();
if (parameters.getMaxNumMeteringAreas() > 0){
Log.i(TAG,"fancy !");
Rect rect = calculateFocusArea(event.getX(), event.getY());
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
List<Camera.Area> meteringAreas = new ArrayList<>();
meteringAreas.add(new Camera.Area(rect, FOCUS_METERING_AREA_WEIGHT_DEFAULT));
parameters.setFocusAreas(meteringAreas);
mCamera.setParameters(parameters);
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (mAutofocusCallback != null) {
mAutofocusCallback.onAutoFocus(success, camera);
}
}
});
} else {
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (mAutofocusCallback != null) {
mAutofocusCallback.onAutoFocus(success, camera);
}
}
});
}
}
}
return true;
}
});
}
private Rect calculateFocusArea(float x, float y) {
int left = clamp(Float.valueOf((x / view.getWidth()) * 2000 - 1000).intValue(), getFocusAreaSize());
int top = clamp(Float.valueOf((y / view.getHeight()) * 2000 - 1000).intValue(), getFocusAreaSize());
return new Rect(left, top, left + getFocusAreaSize(), top + getFocusAreaSize());
}
private int clamp(int touchCoordinateInCameraReper, int focusAreaSize) {
int result;
if (Math.abs(touchCoordinateInCameraReper)+focusAreaSize/2>1000){
if (touchCoordinateInCameraReper>0){
result = 1000 - focusAreaSize/2;
} else {
result = -1000 + focusAreaSize/2;
}
} else{
result = touchCoordinateInCameraReper - focusAreaSize/2;
}
return result;
}
private void openCamera() { private void openCamera() {
if (mCamera != null) { if (mCamera != null) {
releaseCamera(); releaseCamera();

Loading…
Cancel
Save