From dbfb1ee34c1e6e244f656205d68a1e5527214ef1 Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Tue, 10 Sep 2013 17:47:51 +0100 Subject: still tinkering --- src/com/example/rotorm/Preview.java | 181 +++++++++--------------------------- 1 file changed, 45 insertions(+), 136 deletions(-) (limited to 'src/com/example/rotorm/Preview.java') 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 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 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 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 -- cgit v1.2.3