summaryrefslogtreecommitdiff
path: root/src/com/example/rotorm/Preview.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/example/rotorm/Preview.java')
-rw-r--r--src/com/example/rotorm/Preview.java181
1 files changed, 45 insertions, 136 deletions
diff --git a/src/com/example/rotorm/Preview.java b/src/com/example/rotorm/Preview.java
index 5fdea5a..1fdf203 100644
--- a/src/com/example/rotorm/Preview.java
+++ b/src/com/example/rotorm/Preview.java
@@ -1,160 +1,69 @@
package com.example.rotorm;
import java.io.IOException;
-import java.util.List;
-
import android.content.Context;
import android.hardware.Camera;
-import android.hardware.Camera.Size;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
-import android.view.View;
-import android.view.ViewGroup;
-
-class Preview extends ViewGroup implements SurfaceHolder.Callback {
- private final String TAG = "Preview";
-
- SurfaceView mSurfaceView;
- SurfaceHolder mHolder;
- Size mPreviewSize;
- List<Size> mSupportedPreviewSizes;
- Camera mCamera;
- Preview(Context context, SurfaceView sv) {
- super(context);
+public class Preview extends SurfaceView implements SurfaceHolder.Callback {
- mSurfaceView = sv;
-// addView(mSurfaceView);
-
- mHolder = mSurfaceView.getHolder();
- mHolder.addCallback(this);
- mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- }
-
- public void setCamera(Camera camera) {
- mCamera = camera;
- if (mCamera != null) {
- mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
- requestLayout();
+private static final String TAG = "CameraPreview";
- // get Camera parameters
- Camera.Parameters params = mCamera.getParameters();
+private SurfaceHolder mHolder;
+private Camera mCamera;
- List<String> focusModes = params.getSupportedFocusModes();
- if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
- // set the focus mode
- params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
- // set Camera parameters
- mCamera.setParameters(params);
- }
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- // We purposely disregard child measurements because act as a
- // wrapper to a SurfaceView that centers the camera preview instead
- // of stretching it.
- final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
- final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
- setMeasuredDimension(width, height);
+public Preview(Context context, Camera camera) {
+ super(context);
+ mCamera = camera;
+ // Install a SurfaceHolder.Callback so we get notified when the
+ // underlying surface is created and destroyed.
+ mHolder = getHolder();
+ mHolder.addCallback(this);
+ // deprecated setting, but required on Android versions prior to 3.0
+ mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+}
- if (mSupportedPreviewSizes != null) {
- mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
- }
+public void surfaceCreated(SurfaceHolder holder) {
+ // The Surface has been created, now tell the camera where to draw the preview.
+ try {
+ mCamera.setPreviewDisplay(holder);
+ mCamera.startPreview();
+ } catch (IOException e) {
+ Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
+}
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- if (changed && getChildCount() > 0) {
- final View child = getChildAt(0);
-
- final int width = r - l;
- final int height = b - t;
-
- int previewWidth = width;
- int previewHeight = height;
- if (mPreviewSize != null) {
- previewWidth = mPreviewSize.width;
- previewHeight = mPreviewSize.height;
- }
+public void surfaceDestroyed(SurfaceHolder holder) {
+ // empty. Take care of releasing the Camera preview in your activity.
+}
- // Center the child SurfaceView within the parent.
- if (width * previewHeight > height * previewWidth) {
- final int scaledChildWidth = previewWidth * height / previewHeight;
- child.layout((width - scaledChildWidth) / 2, 0,
- (width + scaledChildWidth) / 2, height);
- } else {
- final int scaledChildHeight = previewHeight * width / previewWidth;
- child.layout(0, (height - scaledChildHeight) / 2,
- width, (height + scaledChildHeight) / 2);
- }
- }
- }
+public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+ // If your preview can change or rotate, take care of those events here.
+ // Make sure to stop the preview before resizing or reformatting it.
- public void surfaceCreated(SurfaceHolder holder) {
- // The Surface has been created, acquire the camera and tell it where
- // to draw.
- try {
- if (mCamera != null) {
- mCamera.setPreviewDisplay(holder);
- }
- } catch (IOException exception) {
- Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
- }
+ if (mHolder.getSurface() == null){
+ // preview surface does not exist
+ return;
}
- public void surfaceDestroyed(SurfaceHolder holder) {
- // Surface will be destroyed when we return, so stop the preview.
- if (mCamera != null) {
- mCamera.stopPreview();
- }
+ // stop preview before making changes
+ try {
+ mCamera.stopPreview();
+ } catch (Exception e){
+ // ignore: tried to stop a non-existent preview
}
+ // make any resize, rotate or reformatting changes here
- private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
- final double ASPECT_TOLERANCE = 0.1;
- double targetRatio = (double) w / h;
- if (sizes == null) return null;
-
- Size optimalSize = null;
- double minDiff = Double.MAX_VALUE;
-
- int targetHeight = h;
-
- // Try to find an size match aspect ratio and size
- for (Size size : sizes) {
- double ratio = (double) size.width / size.height;
- if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
- if (Math.abs(size.height - targetHeight) < minDiff) {
- optimalSize = size;
- minDiff = Math.abs(size.height - targetHeight);
- }
- }
+ // start preview with new settings
+ try {
+ mCamera.setPreviewDisplay(mHolder);
+ mCamera.startPreview();
- // Cannot find the one match the aspect ratio, ignore the requirement
- if (optimalSize == null) {
- minDiff = Double.MAX_VALUE;
- for (Size size : sizes) {
- if (Math.abs(size.height - targetHeight) < minDiff) {
- optimalSize = size;
- minDiff = Math.abs(size.height - targetHeight);
- }
- }
- }
- return optimalSize;
+ } catch (Exception e){
+ Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
-
- public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
- if(mCamera != null) {
- Camera.Parameters parameters = mCamera.getParameters();
- parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
- requestLayout();
-
- mCamera.setParameters(parameters);
- mCamera.startPreview();
- }
- }
-
-}
+ }
+} \ No newline at end of file