From 6a8795d1951fdd655f9bc96715380d36b8c8dfa4 Mon Sep 17 00:00:00 2001 From: Thomas BOY Date: Wed, 17 Dec 2014 15:55:53 +0100 Subject: [PATCH] Maintien de la photo quand on tourne l'appareil --- .../res/layout/activity_camera_view.xml | 5 + .../geneanet/customcamera/CameraActivity.java | 167 +++++++++++++----- 2 files changed, 131 insertions(+), 41 deletions(-) diff --git a/src/android/customCamera/res/layout/activity_camera_view.xml b/src/android/customCamera/res/layout/activity_camera_view.xml index 5da06d8..045b79f 100644 --- a/src/android/customCamera/res/layout/activity_camera_view.xml +++ b/src/android/customCamera/res/layout/activity_camera_view.xml @@ -11,6 +11,11 @@ android:layout_alignParentTop="true" > + + 4f) + opt.inSampleSize = 4; + else if (res > 3f) + opt.inSampleSize = 2; + + // Preview from camera + storedBitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt); // Event started after accept picture. accept.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - try { - BitmapFactory.Options opt; - opt = new BitmapFactory.Options(); - // Temp storage to use for decoding - opt.inTempStorage = new byte[16 * 1024]; - Parameters parameters = mCamera.getParameters(); - Size size = parameters.getPictureSize(); - - int height = size.height; - int width = size.width; - float res = (width * height) / 1024000; - - // Return a smaller image for now - if (res > 4f) - opt.inSampleSize = 4; - else if (res > 3f) - opt.inSampleSize = 2; - - // Preview from camera - Bitmap storedBitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt); - + try { // Matrix to perform rotation Matrix mat = new Matrix(); float redirect = redirectPhotoInGallery(); @@ -502,7 +523,7 @@ public class CameraActivity extends Activity { // If mode miniature and photo is declined, the miniature goes back to the bottom if (modeMiniature) { - ImageView imageView = (ImageView) findViewById(R.id.background); + imageView = (ImageView) findViewById(R.id.background); setParamsMiniature(imageView, false); } @@ -632,7 +653,7 @@ public class CameraActivity extends Activity { } // set image at the view. - ImageView imageView = (ImageView) findViewById(R.id.background); + imageView = (ImageView) findViewById(R.id.background); imageView.setImageBitmap(imgBackgroundBitmap); paramsMiniature.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); @@ -642,13 +663,77 @@ public class CameraActivity extends Activity { @Override protected void onSaveInstanceState(Bundle outState) { - // TODO Auto-generated method stub - super.onSaveInstanceState(outState); + outState.putBoolean("modeMiniature", modeMiniature); + outState.putBoolean("photoTaken", photoTaken); + outState.putParcelable("storedBitmap", storedBitmap); + super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { - // TODO Auto-generated method stub - super.onRestoreInstanceState(savedInstanceState); + // We get the last value of modeMiniature + modeMiniature = savedInstanceState.getBoolean("modeMiniature"); + // We get the last value of photoTaken + photoTaken = savedInstanceState.getBoolean("photoTaken"); + storedBitmap = savedInstanceState.getParcelable("storedBitmap"); + + // If the miniature is on when we rotate + if (modeMiniature) { + imageView = (ImageView) findViewById(R.id.background); + setParamsMiniature(imageView, false); + modeMiniature = false; + } + + if (photoTaken) { + // Matrix to perform rotation + Matrix mat = new Matrix(); + mat.postRotate(270); + + // Creation of the bitmap + storedBitmap = Bitmap.createBitmap(storedBitmap, 0, 0, storedBitmap.getWidth(), storedBitmap.getHeight(), mat, true); + Bitmap newBitmap = resizeAfterRotate(storedBitmap); + ImageView photoResized = (ImageView) findViewById(R.id.photoResized); + photoResized.setImageBitmap(newBitmap); + imageView = (ImageView) findViewById(R.id.background); + preview.setVisibility(View.INVISIBLE); + } + + super.onRestoreInstanceState(savedInstanceState); + } + + /** + * Resize the bitmap saved when you rotate the device. + * + * @param Bitmap bitmap The original bitmap + * + * @return the new bitmap. + */ + protected Bitmap resizeAfterRotate(Bitmap bitmap){ + // Initialize the new bitmap resized + Bitmap newBitmap = null; + + // Get sizes screen. + Display defaultDisplay = getWindowManager().getDefaultDisplay(); + DisplayMetrics displayMetrics = new DisplayMetrics(); + defaultDisplay.getMetrics(displayMetrics); + int displayWidthPx = (int) displayMetrics.widthPixels; + int displayHeightPx = (int) displayMetrics.heightPixels; + + // Get sizes picture. + int widthBackground = (int) (bitmap.getWidth() * displayMetrics.density); + int heightBackground = (int) (bitmap.getHeight() * displayMetrics.density); + + // Change size ImageView. + float ratioX = (float) displayWidthPx / (float) widthBackground; + float ratioY = (float) displayHeightPx / (float) heightBackground; + if (ratioX < ratioY && ratioX < 1) { + System.out.println("OK"); + newBitmap = Bitmap.createScaledBitmap(bitmap, (int) displayWidthPx, (int) (ratioX * heightBackground), false); + } else if (ratioX >= ratioY && ratioY < 1) { + System.out.println("OK2"); + newBitmap = Bitmap.createScaledBitmap(bitmap, (int) (ratioY * widthBackground), (int) displayHeightPx, false); + } + + return newBitmap; } }