diff --git a/package/android/src/main/java/com/mrousavy/camera/CameraView.kt b/package/android/src/main/java/com/mrousavy/camera/CameraView.kt index 5849573..fa25aae 100644 --- a/package/android/src/main/java/com/mrousavy/camera/CameraView.kt +++ b/package/android/src/main/java/com/mrousavy/camera/CameraView.kt @@ -72,6 +72,10 @@ class CameraView(context: Context) : var zoom: Float = 1f // in "factor" var exposure: Double = 1.0 var orientation: Orientation = Orientation.PORTRAIT + set(value) { + field = value + previewView.orientation = value + } var enableZoomGesture = false set(value) { field = value diff --git a/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt b/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt index 2c9f579..d27a27a 100644 --- a/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt +++ b/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt @@ -10,6 +10,7 @@ import com.mrousavy.camera.types.CodeScannerOptions import com.mrousavy.camera.types.Orientation import com.mrousavy.camera.types.PixelFormat import com.mrousavy.camera.types.ResizeMode +import android.util.Log import com.mrousavy.camera.types.Torch import com.mrousavy.camera.types.VideoStabilizationMode @@ -182,6 +183,7 @@ class CameraViewManager : ViewGroupManager() { fun setOrientation(view: CameraView, orientation: String?) { if (orientation != null) { val newMode = Orientation.fromUnionValue(orientation) + Log.i(TAG, "Orientation set to: $newMode") view.orientation = newMode } else { view.orientation = Orientation.PORTRAIT diff --git a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt index 501cab3..6f29157 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt @@ -312,7 +312,7 @@ class CameraSession(private val context: Context, private val cameraManager: Cam enableHdr ) outputs.add(output) - // Size is usually landscape, so we flip it here + previewView?.setSurfaceSize(size.width, size.height, deviceDetails.sensorOrientation) } diff --git a/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt b/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt index 0727a1f..56f3c64 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt @@ -36,6 +36,14 @@ class PreviewView(context: Context, callback: SurfaceHolder.Callback) : updateLayout() } } + var orientation: Orientation = Orientation.PORTRAIT + set(value) { + if (field != value) { + Log.i(TAG, "View Orientation changed: $field -> $value") + field = value + updateLayout() + } + } private var inputOrientation: Orientation = Orientation.LANDSCAPE_LEFT set(value) { if (field != value) { @@ -101,8 +109,14 @@ class PreviewView(context: Context, callback: SurfaceHolder.Callback) : } private fun getSize(contentSize: Size, containerSize: Size, resizeMode: ResizeMode): Size { + var contentSize = contentSize + // Swap dimensions if orientation is landscape + if (orientation.isLandscape()) { + contentSize = Size(contentSize.height, contentSize.width) + } val contentAspectRatio = contentSize.width.toDouble() / contentSize.height val containerAspectRatio = containerSize.width.toDouble() / containerSize.height + Log.i(TAG, "Getting size: $contentSize -> $containerSize, orientation: $orientation") if (!(contentAspectRatio > 0 && containerAspectRatio > 0)) { // One of the aspect ratios is 0 or NaN, maybe the view hasn't been laid out yet. return contentSize @@ -128,11 +142,12 @@ class PreviewView(context: Context, callback: SurfaceHolder.Callback) : override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) - val viewSize = Size(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)) + val measuredViewSize = Size(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)) val surfaceSize = size.rotatedBy(inputOrientation) - val fittedSize = getSize(surfaceSize, viewSize, resizeMode) + val fittedSize = getSize(surfaceSize, measuredViewSize, resizeMode) - Log.i(TAG, "PreviewView is $viewSize, rendering $surfaceSize content ($inputOrientation). Resizing to: $fittedSize ($resizeMode)") + Log.i(TAG, "onMeasure $widthMeasureSpec, $heightMeasureSpec") + Log.i(TAG, """PreviewView is $measuredViewSize, $viewSize rendering $surfaceSize content ($inputOrientation). Resizing to: $fittedSize ($resizeMode)""") setMeasuredDimension(fittedSize.width, fittedSize.height) }