diff --git a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java index b6c3935..5b3ea77 100644 --- a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java +++ b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java @@ -101,7 +101,7 @@ public class CameraActivity extends Activity { // The zoom bar progress final SeekBar zoomLevel = (SeekBar) findViewById(R.id.zoomLevel); - final Camera.Parameters paramsCamera = customCamera.getParameters(); + Camera.Parameters paramsCamera = customCamera.getParameters(); if (paramsCamera.isZoomSupported()) { final int zoom = paramsCamera.getZoom(); int maxZoom = paramsCamera.getMaxZoom(); @@ -111,9 +111,10 @@ public class CameraActivity extends Activity { int progress = 0; @Override - public void onProgressChanged(SeekBar seekBar, int progresValue, + public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) { - progress = progresValue; + Camera.Parameters paramsCamera = ManagerCamera.getCurrentCameraResource().getParameters(); + progress = progressValue; int newZoom = (int) (zoom + progress); zoomLevel.setProgress(newZoom); paramsCamera.setZoom(newZoom); @@ -228,36 +229,40 @@ public class CameraActivity extends Activity { RelativeLayout.LayoutParams paramsCameraPreview = new RelativeLayout.LayoutParams(cameraPreview.getLayoutParams()); - Size camParameters = customCamera.getParameters().getPictureSize(); + Size camParametersSize = customCamera.getParameters().getPictureSize(); - int minSize = Math.min(camParameters.width, camParameters.height); - int maxSize = Math.max(camParameters.width, camParameters.height); + int minSize = Math.min(camParametersSize.width, camParametersSize.height); + int maxSize = Math.max(camParametersSize.width, camParametersSize.height); int widthScreen = dm.widthPixels; int heightScreen = dm.heightPixels; int marginLeft = 0; int marginTop = 0; - float ratioWidth, ratioHeight, sizeToResize; + float ratioWidth, ratioHeight, sizeToResize, sizeToResizeMatchParent; if (widthScreen > heightScreen) { ratioWidth = ((float)maxSize / (float)widthScreen); ratioHeight = ((float)minSize / (float)heightScreen); sizeToResize = ratioWidth > ratioHeight ? minSize : maxSize; + sizeToResizeMatchParent = ratioWidth > ratioHeight ? maxSize : minSize; } else { ratioWidth = ((float)minSize / (float)widthScreen); ratioHeight = ((float)maxSize / (float)heightScreen); sizeToResize = ratioWidth > ratioHeight ? maxSize : minSize; + sizeToResizeMatchParent = ratioWidth > ratioHeight ? minSize : maxSize; } if (ratioWidth > ratioHeight) { paramsCameraPreview.height = (int)(sizeToResize / ratioWidth); - paramsCameraPreview.width = LayoutParams.MATCH_PARENT; + paramsCameraPreview.width = (int)(sizeToResizeMatchParent / ratioWidth); marginTop = (int)(((float)(heightScreen - paramsCameraPreview.height)) / 2); } else { - paramsCameraPreview.height = LayoutParams.MATCH_PARENT; + paramsCameraPreview.height = (int)(sizeToResizeMatchParent / ratioHeight); paramsCameraPreview.width = (int)(sizeToResize / ratioHeight);; marginLeft = (int)(((float)(widthScreen - paramsCameraPreview.width)) / 2); } paramsCameraPreview.setMargins(marginLeft, marginTop, 0, 0); cameraPreview.setLayoutParams(paramsCameraPreview); + setPreviewSize(); + // Assign the render camera to the view CameraPreview myPreview = new CameraPreview(this, customCamera); cameraPreview.addView(myPreview); @@ -962,7 +967,6 @@ public class CameraActivity extends Activity { } protected void setFlashMode() { - ImageButton flash = (ImageButton)findViewById(R.id.flash); if (hasFlash()) { String mode = Camera.Parameters.FLASH_MODE_OFF; switch(stateFlash) { @@ -1013,7 +1017,26 @@ public class CameraActivity extends Activity { initCameraResource(oppositeCamera); FrameLayout cameraPreview = (FrameLayout) findViewById(R.id.camera_preview); cameraPreview.removeAllViews(); + setPreviewSize(); CameraPreview myPreview = new CameraPreview(this, customCamera); cameraPreview.addView(myPreview); } + + /** + * To set the size of the preview. + */ + private void setPreviewSize() { + FrameLayout cameraPreview = (FrameLayout) findViewById(R.id.camera_preview); + RelativeLayout.LayoutParams paramsCameraPreview = + new RelativeLayout.LayoutParams(cameraPreview.getLayoutParams()); + Size optimalSize; + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { + optimalSize = ManagerCamera.getOptimalPreviewSize(paramsCameraPreview.width, paramsCameraPreview.height); + } else { + optimalSize = ManagerCamera.getOptimalPreviewSize(paramsCameraPreview.height, paramsCameraPreview.width); + } + Camera.Parameters camParameters = customCamera.getParameters(); + camParameters.setPreviewSize(optimalSize.width, optimalSize.height); + customCamera.setParameters(camParameters); + } } diff --git a/src/android/customCamera/src/org/geneanet/customcamera/ManagerCamera.java b/src/android/customCamera/src/org/geneanet/customcamera/ManagerCamera.java index c6fe0ce..577c838 100644 --- a/src/android/customCamera/src/org/geneanet/customcamera/ManagerCamera.java +++ b/src/android/customCamera/src/org/geneanet/customcamera/ManagerCamera.java @@ -1,5 +1,7 @@ package org.geneanet.customcamera; +import java.util.List; + import android.app.Activity; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; @@ -194,4 +196,50 @@ public class ManagerCamera { public static Camera getCurrentCameraResource() { return ManagerCamera.mCamera; } + + /** + * Get the optimal preview size. + * based on http://stackoverflow.com/questions/19577299/android-camera-preview-stretched + * + * @param int w Width of the wanted preview. + * @param int h Height of the wanted preview. + * + * @return Camera.Size Optimal resolution. + */ + public static Camera.Size getOptimalPreviewSize(int w, int h) { + if (ManagerCamera.mCamera == null) { + return null; + } + List sizes = ManagerCamera.mCamera.getParameters().getSupportedPreviewSizes(); + + if (sizes == null) { + return null; + } + + final double ASPECT_TOLERANCE = 0.1; + double targetRatio = (double)h / w; + Camera.Size optimalSize = null; + double minDiff = Double.MAX_VALUE; + + int targetHeight = h; + + for (Camera.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); + } + } + + if (optimalSize == null) { + for (Camera.Size size : sizes) { + if (Math.abs(size.height - targetHeight) < minDiff) { + optimalSize = size; + minDiff = Math.abs(size.height - targetHeight); + } + } + } + return optimalSize; + } }