diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java index d9549086..6aa6b1ba 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java @@ -389,6 +389,16 @@ abstract class CameraController implements */ protected Size computePictureSize(List captureSizes) { SizeSelector selector; + + // The external selector is expecting stuff in the view world, not in the sensor world. + // Flip before starting, and then flip again. + boolean flip = shouldFlipSizes(); + if (flip) { + for (Size size : captureSizes) { + size.flip(); + } + } + if (mSessionType == SessionType.PICTURE) { selector = SizeSelectors.or( mPictureSizeSelector, @@ -396,10 +406,11 @@ abstract class CameraController implements ); } else { // The Camcorder internally checks for cameraParameters.getSupportedVideoSizes() etc. - // We want the picture size to be the max picture consistent with the video aspect ratio. + // And we want the picture size to be the max picture consistent with the video aspect ratio. // -> Use the external picture selector, but enforce the ratio constraint. CamcorderProfile profile = getCamcorderProfile(); AspectRatio targetRatio = AspectRatio.of(profile.videoFrameWidth, profile.videoFrameHeight); + if (flip) targetRatio = targetRatio.inverse(); LOG.i("size:", "computeCaptureSize:", "videoQuality:", mVideoQuality, "targetRatio:", targetRatio); SizeSelector matchRatio = SizeSelectors.aspectRatio(targetRatio, 0); selector = SizeSelectors.or( @@ -408,7 +419,10 @@ abstract class CameraController implements mPictureSizeSelector ); } - return selector.select(captureSizes).get(0); + + Size result = selector.select(captureSizes).get(0); + if (flip) result.flip(); + return result; } protected Size computePreviewSize(List previewSizes) { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 6e611d80..40fb319a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -181,7 +181,6 @@ public class CameraView extends FrameLayout { // Apply gestures mapGesture(Gesture.TAP, tapGesture); - // mapGesture(Gesture.DOUBLE_TAP, doubleTapGesture); mapGesture(Gesture.LONG_TAP, longTapGesture); mapGesture(Gesture.PINCH, pinchGesture); mapGesture(Gesture.SCROLL_HORIZONTAL, scrollHorizontalGesture); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/Size.java b/cameraview/src/main/java/com/otaliastudios/cameraview/Size.java index a3e2e217..79be98d9 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/Size.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/Size.java @@ -2,10 +2,13 @@ package com.otaliastudios.cameraview; import android.support.annotation.NonNull; +/** + * A simple class representing a size, with width and height values. + */ public class Size implements Comparable { - private final int mWidth; - private final int mHeight; + private int mWidth; + private int mHeight; Size(int width, int height) { mWidth = width; @@ -20,6 +23,16 @@ public class Size implements Comparable { return mHeight; } + /** + * Flips width and height altogether. + */ + @SuppressWarnings("SuspiciousNameCombination") + public void flip() { + int temp = mWidth; + mWidth = mHeight; + mHeight = temp; + } + @Override public boolean equals(Object o) { if (o == null) { diff --git a/cameraview/src/test/java/com/otaliastudios/cameraview/SizeTest.java b/cameraview/src/test/java/com/otaliastudios/cameraview/SizeTest.java index aff2dea3..fae207d9 100644 --- a/cameraview/src/test/java/com/otaliastudios/cameraview/SizeTest.java +++ b/cameraview/src/test/java/com/otaliastudios/cameraview/SizeTest.java @@ -11,11 +11,19 @@ public class SizeTest { @Test public void testDimensions() { Size size = new Size(10, 20); - assertEquals(size.getWidth(), 10f, 0f); - assertEquals(size.getHeight(), 20f, 0f); + assertEquals(size.getWidth(), 10); + assertEquals(size.getHeight(), 20); assertEquals("10x20", size.toString()); } + @Test + public void testFlip() { + Size size = new Size(10, 20); + size.flip(); + assertEquals(size.getWidth(), 20); + assertEquals(size.getHeight(), 10); + } + @Test public void testEquals() { Size s1 = new Size(10, 20);