From 8da0c5a4e0c029d91d53e8bee3f24590cc47c754 Mon Sep 17 00:00:00 2001 From: Christophe BOUCAUT Date: Fri, 6 Feb 2015 12:16:34 +0100 Subject: [PATCH 1/5] =?UTF-8?q?Premi=C3=A8re=20mise=20en=20place=20d'un=20?= =?UTF-8?q?fix.=20A=20retravailler.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customCamera/res/values/styles.xml | 2 +- .../geneanet/customcamera/CameraActivity.java | 32 ++++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/android/customCamera/res/values/styles.xml b/src/android/customCamera/res/values/styles.xml index 908012e..8546cd9 100644 --- a/src/android/customCamera/res/values/styles.xml +++ b/src/android/customCamera/res/values/styles.xml @@ -14,6 +14,6 @@ + diff --git a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java index 65c3863..6ba9613 100644 --- a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java +++ b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java @@ -243,17 +243,33 @@ public class CameraActivity extends Activity { int widthScreen = dm.widthPixels; int heightScreen = dm.heightPixels; - float ratio; - if (widthScreen > heightScreen) { - paramsCameraPreview.height = LayoutParams.FILL_PARENT; - ratio = ( (float)minSize / (float)heightScreen ); - paramsCameraPreview.width = (int)(maxSize / ratio); + float ratio = widthScreen > heightScreen ? ((float)minSize / (float)heightScreen) : ((float)minSize / (float)widthScreen); + /** + * landscape and width resized isn't more large screen's width. + * OR + * portrait and height resized is more large screen's height. + */ + if ( + (widthScreen > heightScreen && (int)(maxSize / ratio) <= widthScreen) || + (widthScreen < heightScreen && (int)(maxSize / ratio) > heightScreen) + ) { + paramsCameraPreview.height = LayoutParams.MATCH_PARENT; + if (widthScreen < heightScreen) { + ratio = ((float)maxSize / (float)heightScreen); + paramsCameraPreview.width = (int)(minSize / ratio); + } else { + paramsCameraPreview.width = (int)(maxSize / ratio); + } int marginLeft = (int) (((float)(widthScreen - paramsCameraPreview.width)) / 2); paramsCameraPreview.setMargins(marginLeft, 0, 0, 0); } else { - paramsCameraPreview.width = LayoutParams.FILL_PARENT; - ratio = ( (float)minSize / (float)widthScreen ); - paramsCameraPreview.height = (int)(maxSize / ratio); + paramsCameraPreview.width = LayoutParams.MATCH_PARENT; + if (widthScreen > heightScreen) { + ratio = ((float)maxSize / (float)widthScreen); + paramsCameraPreview.height = (int)(minSize / ratio); + } else { + paramsCameraPreview.height = (int)(maxSize / ratio); + } int marginTop = (int) (((float)(heightScreen - paramsCameraPreview.height)) / 2); paramsCameraPreview.setMargins(0, marginTop, 0, 0); } From f219e2d291af238a9e5ccf945d422b469586cda5 Mon Sep 17 00:00:00 2001 From: Christophe BOUCAUT Date: Fri, 6 Feb 2015 14:52:56 +0100 Subject: [PATCH 2/5] Refacto du redimensionnement de la preview. --- .../geneanet/customcamera/CameraActivity.java | 48 ++++++++----------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java index 6ba9613..798f75f 100644 --- a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java +++ b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java @@ -243,36 +243,28 @@ public class CameraActivity extends Activity { int widthScreen = dm.widthPixels; int heightScreen = dm.heightPixels; - float ratio = widthScreen > heightScreen ? ((float)minSize / (float)heightScreen) : ((float)minSize / (float)widthScreen); - /** - * landscape and width resized isn't more large screen's width. - * OR - * portrait and height resized is more large screen's height. - */ - if ( - (widthScreen > heightScreen && (int)(maxSize / ratio) <= widthScreen) || - (widthScreen < heightScreen && (int)(maxSize / ratio) > heightScreen) - ) { - paramsCameraPreview.height = LayoutParams.MATCH_PARENT; - if (widthScreen < heightScreen) { - ratio = ((float)maxSize / (float)heightScreen); - paramsCameraPreview.width = (int)(minSize / ratio); - } else { - paramsCameraPreview.width = (int)(maxSize / ratio); - } - int marginLeft = (int) (((float)(widthScreen - paramsCameraPreview.width)) / 2); - paramsCameraPreview.setMargins(marginLeft, 0, 0, 0); + int marginLeft = 0; + int marginTop = 0; + float ratioWidth, ratioHeight, sizeToResize; + if (widthScreen > heightScreen) { + ratioWidth = ((float)maxSize / (float)widthScreen); + ratioHeight = ((float)minSize / (float)heightScreen); + sizeToResize = ratioWidth > ratioHeight ? minSize : maxSize; } else { - paramsCameraPreview.width = LayoutParams.MATCH_PARENT; - if (widthScreen > heightScreen) { - ratio = ((float)maxSize / (float)widthScreen); - paramsCameraPreview.height = (int)(minSize / ratio); - } else { - paramsCameraPreview.height = (int)(maxSize / ratio); - } - int marginTop = (int) (((float)(heightScreen - paramsCameraPreview.height)) / 2); - paramsCameraPreview.setMargins(0, marginTop, 0, 0); + ratioWidth = ((float)minSize / (float)widthScreen); + ratioHeight = ((float)maxSize / (float)heightScreen); + sizeToResize = ratioWidth > ratioHeight ? maxSize : minSize; } + if (ratioWidth > ratioHeight) { + paramsCameraPreview.height = (int)(sizeToResize / ratioWidth); + paramsCameraPreview.width = LayoutParams.MATCH_PARENT; + marginTop = (int)(((float)(heightScreen - paramsCameraPreview.height)) / 2); + } else { + paramsCameraPreview.height = LayoutParams.MATCH_PARENT; + paramsCameraPreview.width = (int)(sizeToResize / ratioHeight);; + marginLeft = (int)(((float)(widthScreen - paramsCameraPreview.width)) / 2); + } + paramsCameraPreview.setMargins(marginLeft, marginTop, 0, 0); cameraPreview.setLayoutParams(paramsCameraPreview); // Assign the render camera to the view From 7763b2ba8c5e6be30b7b3ffff0a71e3cd23c102d Mon Sep 17 00:00:00 2001 From: Thomas BOY Date: Mon, 9 Feb 2015 10:00:11 +0100 Subject: [PATCH 3/5] Reecriture pour avoir getRotation via windowManager --- .../src/org/geneanet/customcamera/CameraActivity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java index 798f75f..e91896e 100644 --- a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java +++ b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java @@ -881,8 +881,7 @@ public class CameraActivity extends Activity { * @return the code of the rotation (0, 1, 2, 3) */ protected int getCustomRotation() { - WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); - int code = windowManager.getDefaultDisplay().getRotation(); + int code = this.getWindowManager().getDefaultDisplay().getRotation(); if (getDeviceDefaultOrientation() == 2) { code ++; } From b1c25794652256d2d744ba36f877b79b7e20d011 Mon Sep 17 00:00:00 2001 From: Thomas BOY Date: Tue, 10 Feb 2015 09:45:39 +0100 Subject: [PATCH 4/5] =?UTF-8?q?Utilisation=20de=20Math=20pour=20d=C3=A9ter?= =?UTF-8?q?miner=20le=20minSize=20et=20maxSize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/geneanet/customcamera/CameraActivity.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java index e91896e..f934acd 100644 --- a/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java +++ b/src/android/customCamera/src/org/geneanet/customcamera/CameraActivity.java @@ -231,16 +231,8 @@ public class CameraActivity extends Activity { Size camParameters = customCamera.getParameters().getPictureSize(); - int minSize; - int maxSize; - if (camParameters.width > camParameters.height) { - maxSize = camParameters.width; - minSize = camParameters.height; - } else { - maxSize = camParameters.height; - minSize = camParameters.width; - } - + int minSize = Math.min(camParameters.width, camParameters.height); + int maxSize = Math.max(camParameters.width, camParameters.height); int widthScreen = dm.widthPixels; int heightScreen = dm.heightPixels; int marginLeft = 0; From 1e8d3bb9f34444be4800432204aa4855b8b8fc18 Mon Sep 17 00:00:00 2001 From: Thomas BOY Date: Tue, 10 Feb 2015 11:06:39 +0100 Subject: [PATCH 5/5] Modification des noms de variables. Fix bug: - Etirement preview : On determine la meilleure resolution de la camera parmi celles disponibles et en fonction de la taille de la preview. --- .../geneanet/customcamera/CameraActivity.java | 43 +++++++++++++---- .../geneanet/customcamera/ManagerCamera.java | 48 +++++++++++++++++++ 2 files changed, 81 insertions(+), 10 deletions(-) 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; + } }